У меня есть следующий метод в моей модели CakePHP:
public function login($login,$password){
$arr = $this->find('first',array(
'conditions' => array(
'deleted' => 0,
'online' => 1,
'login' => $login,
'AES_DECRYPT(UNHEX(password),'secretkey')=\''.$password.'\''
)
));return $arr;
}
Этот метод принимает два параметра ($ login, $ password) для аутентификации пользователя.
Мне интересно, если этот метод безопасен от SQL-инъекций и других атак.
Если не, Каков наилучший способ очистки входных параметров с помощью CakePHP?
Я вижу, что класс Sanitize устарел с 2.4.
Model::find()
безопасно только при правильном использовании!Вы должны знать, что только значения в key => value
пары экранируются, ключи и не числовые значения вставляются в SQL-запрос как есть!
Цитата из документов
CakePHP экранирует только значения массива. Вы никогда не должны помещать пользовательские данные в ключи. Это сделает вас уязвимыми для SQL-инъекций.
http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions
Так что ваши find()
вызов как есть, небезопасен и подвержен SQL-инъекциям, вместо этого он должен выглядеть следующим образом:
$arr = $this->find('first',array(
'conditions' => array(
'deleted' => 0,
'online' => 1,
'login' => $login,
'AES_DECRYPT(UNHEX(password),\'secretkey\')' => $password
)
));
Таким образом, пользовательский ввод $login
а также $password
сбежал должным образом.
$Model->find
должен быть безопасным, потому что он будет экранировать данные перед выполнением запроса sql.
http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping
Лучший способ — использовать встроенную аутентификацию CakePHP, которая сделает всю работу за вас (см. Документ: http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html)
Но если вам нужно сделать свою собственную функцию входа в систему, Cakephp экранирует все параметры, если вы используете встроенные методы, такие как save()
или же find()
,… Так, ДА, ваш find()
метод безопасно. (подтверждено документом здесь: http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping)
Для пользовательских sql, созданных вручную, вам придется вручную экранировать ваши параметры, потому что они не экранированы Cakephp