【发布时间】:2010-08-20 19:33:38
【问题描述】:
由于某种原因,AppModel->updateAll() 方法不会转义传递给它的数据。但是查看文档,我找不到任何关于您如何使用 CakePHP 实际转义数据的信息。
在datasources/dbo/dbo_mysql.php 下,我发现value() 方法似乎只使用mysql_real_escape_string() - 但是如何从模型中访问该方法?
【问题讨论】:
由于某种原因,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 开始就被弃用了。
【讨论】:
Sanitize::escape(string $string, string $connection),所以我只需要弄清楚如何获取连接名称。
value() 方法,您可以使用 $dataSource = $this->getDataSource(); 然后 $escapedValue = $datasource->value($rawValue); 在控制器中,使用 $dataSource = $this->ModelName->getDataSource(); 其中 ModelName 是任何模型的名称可从该控制器访问。
$name = "somename";
$db = $this->getDataSource();
$this->Model->query('SELECT * FROM models WHERE name = '.$db->value($name, 'string') . ';');
CakePHP 还关心引用您的输入,因为它被标记为字符串。
SELECT * FROM models WHERE name = "somename";
【讨论】:
这是另一种处理方式,使用 Sanitize::paranoid:
http://www.ibm.com/developerworks/opensource/library/os-php-cake3/
【讨论】: