如何在 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 数据?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL,如何在字符串中转义单引号?

sql 如何在T-SQL中转义百分比符号

如何在 db2 sql 中转义撇号

如何在 db2 sql 中转义撇号

NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?

如何在 SQL Server Like 子句中转义通配符