由于某种原因,该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'] );
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) . "'"
这曾经是一个选项,但自CakePHP 2.4起就被弃用了.