由于某种原因,该AppModel->updateAll()方法不会转义传递给它的数据.查看文档,我找不到任何关于如何使用CakePHP实际转义数据的内容.
在datasources/dbo/dbo_mysql.php我找到了value()似乎只是使用的方法mysql_real_escape_string()- 但是如何在模型中从上面访问该方法?
对于CakePHP的大多数模型函数,您不必担心转义输入.
如果您使用CakePHP已经保护您免受SQL注入:
- CakePHP的ORM方法(例如
find()和save())加:- 正确的数组表示法(即.
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']
);
Run Code Online (Sandbox Code Playgroud)
Model->getDataSource()->value()$sql = 'SELECT * FROM table WHERE name = '
. $this->MyModel->getDataSource()->value($untrustedInput, 'string') . ';'
Run Code Online (Sandbox Code Playgroud)
该value()函数基本上转义并添加如下引号:
"'" . mysql_real_escape_string($data, $this->MyModel->getDataSource()->connection) . "'"
Run Code Online (Sandbox Code Playgroud)
这曾经是一个选项,但自CakePHP 2.4起就被弃用了.