如何在 CakePHP 中转义 SQL 数据?
Posted
技术标签:
【中文标题】如何在 CakePHP 中转义 SQL 数据?【英文标题】:How do you escape SQL data in CakePHP? 【发布时间】:2010-08-20 19:33:38 【问题描述】:由于某种原因,AppModel->updateAll()
方法不会转义传递给它的数据。但是查看文档,我找不到任何关于您如何使用 Cakephp 实际转义数据的信息。
在datasources/dbo/dbo_mysql.php
下,我发现value()
方法似乎只使用mysql_real_escape_string()
- 但是如何从模型中访问该方法?
【问题讨论】:
【参考方案1】:对于大部分 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 开始就被弃用了。
【讨论】:
虽然 SOME ORM 函数确实如此(很疯狂吧?),但对于 updateAll() 方法却不是这样。但是,您发布的那个链接将我带到了Sanitize::escape(string $string, string $connection)
,所以我只需要弄清楚如何获取连接名称。
我和原来的问题有同样的问题,你有没有想过如何使用 Sanitize::escape?
@dereferenced 要在模型中使用 link 中描述的 value()
方法,您可以使用 $dataSource = $this->getDataSource();
然后 $escapedValue = $datasource->value($rawValue);
在控制器中,使用 $dataSource = $this->ModelName->getDataSource();
其中 ModelName 是任何模型的名称可从该控制器访问。
@Meam 你的答案应该是真实的~ 你应该把它作为答案发布,然后让我给你点赞!
盖伦,我编辑了您的帖子以包含其他人评论的其他选项。希望没关系。【参考方案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";
【讨论】:
【参考方案3】:这是另一种处理方式,使用 Sanitize::paranoid:
http://www.ibm.com/developerworks/opensource/library/os-php-cake3/
【讨论】:
以上是关于如何在 CakePHP 中转义 SQL 数据?的主要内容,如果未能解决你的问题,请参考以下文章