По какой-то причине метод AppModel-> updateAll ()
не экранирует передаваемые ему данные. Однако, просматривая документацию, я не могу найти ничего о том, как вы на самом деле избегаете данных с помощью CakePHP.
В datasources / dbo / dbo_mysql.php
я нашел метод value ()
, который, кажется, просто использует mysql_real_escape_string ()
- но как вы получить доступ к этому методу сверху в моделях?
Для большинства функций модели CakePHP вам не нужно беспокоиться об экранировании ввода.
CakePHP уже защищает вас от SQL-инъекция, если вы используете:
- ORM CakePHP методы (такие как
find ()
иsave ()
) плюс:- Правильная нотация массива (т.е.
массив ('field' => $ value)
) вместо необработанный SQL.Для очистки от XSS как правило, лучше сохранять необработанный HTML в базе данных без изменений и продезинфицировать во время вывод / отображение.
См. https://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html Однако есть и другие случаи, когда вам нужно выполнить собственный SQL-запрос или подзапрос. В этих случаях вы можете либо:
$db->fetchAll(
'SELECT * from users where username = :username AND password = :password',
['username' => 'jhon','password' => '12345']
);
Модель-> getDataSource () -> value ()
$sql = 'SELECT * FROM table WHERE name = '
. $this->MyModel->getDataSource()->value($untrustedInput, 'string') . ';'
Функция value ()
в основном экранирует и добавляет такие кавычки:
"'" . mysql_real_escape_string($data, $this->MyModel->getDataSource()->connection) . "'"
Этот использовал в качестве опции, но был объявлен устаревшим в CakePHP 2.4.