Как вы избегаете данных SQL в CakePHP? - PullRequest
9 голосов
/ 20 августа 2010

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

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

Ответы [ 3 ]

9 голосов
/ 20 августа 2010

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

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

  1. Методы ORM в CakePHP (например, find() и save()) плюс:
  2. Правильная запись массива (т. Е. array('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']
);

Выборочное экранирование с Model->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.

3 голосов
/ 17 августа 2014
$name = "somename";

$db = $this->getDataSource();
$this->Model->query('SELECT * FROM models WHERE name = '.$db->value($name, 'string') . ';');

CakePHP также заботится о цитировании вашего ввода, потому что оно помечено как строка.

SELECT * FROM models WHERE name = "somename";
0 голосов
/ 19 сентября 2011

Вот альтернативный способ, используя Sanitize :: paranoid:

http://www.ibm.com/developerworks/opensource/library/os-php-cake3/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...