【问题标题】:How do you escape SQL data in CakePHP?如何在 CakePHP 中转义 SQL 数据?
【发布时间】:2010-08-20 19:33:38
【问题描述】:

由于某种原因,AppModel->updateAll() 方法不会转义传递给它的数据。但是查看文档,我找不到任何关于您如何使用 CakePHP 实际转义数据的信息。

datasources/dbo/dbo_mysql.php 下,我发现value() 方法似乎只使用mysql_real_escape_string() - 但是如何从模型中访问该方法?

【问题讨论】:

    标签: php orm cakephp


    【解决方案1】:

    对于大部分 CakePHP 的模型函数,您不必担心转义输入。

    CakePHP 已经保护您免受 如果你使用 SQL 注入:

    1. CakePHP 的 ORM 方法(例如find()save())加:
    2. 正确的数组表示法(即。 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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多