由于某种原因,AppModel->updateAll()
方法不会转义传递给它的数据。但是查看文档,我找不到任何关于如何使用CakePHP实际转义数据的内容。
向下datasources/dbo/dbo_mysql.php
我找到了似乎只使用value()
的{{1}}方法 - 但是如何在模型中从上方访问该方法?
答案 0 :(得分:9)
对于大多数的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起已弃用。
答案 1 :(得分:2)
$name = "somename";
$db = $this->getDataSource();
$this->Model->query('SELECT * FROM models WHERE name = '.$db->value($name, 'string') . ';');
CakePHP还关注引用您的输入,因为它被标记为字符串。
SELECT * FROM models WHERE name = "somename";
答案 2 :(得分:-1)
这是另一种做事方式,使用Sanitize :: paranoid:
http://www.ibm.com/developerworks/opensource/library/os-php-cake3/