CakePHP параметр очистки

У меня есть следующий метод в моей модели 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.

0

Решение

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 сбежал должным образом.

1

Другие решения

$Model->find должен быть безопасным, потому что он будет экранировать данные перед выполнением запроса sql.

http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping

0

Лучший способ — использовать встроенную аутентификацию 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

0
По вопросам рекламы [email protected]