Как вы избегаете данных SQL в CakePHP?

По какой-то причине метод AppModel-> updateAll () не экранирует передаваемые ему данные. Однако, просматривая документацию, я не могу найти ничего о том, как вы на самом деле избегаете данных с помощью CakePHP.

В datasources / dbo / dbo_mysql.php я нашел метод value () , который, кажется, просто использует mysql_real_escape_string () - но как вы получить доступ к этому методу сверху в моделях?

9
задан Simon East 10 March 2015 в 11:58
поделиться

1 ответ

Для большинства функций модели CakePHP вам не нужно беспокоиться об экранировании ввода.

CakePHP уже защищает вас от SQL-инъекция, если вы используете:

  1. ORM CakePHP методы (такие как find () и save () ) плюс:
  2. Правильная нотация массива (т.е. массив ('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) . "'"

Sanitize Class

Этот использовал в качестве опции, но был объявлен устаревшим в CakePHP 2.4.

9
ответ дан 3 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: