【问题标题】:CakePHP sanitize parameterCakePHP 清理参数
【发布时间】:2014-11-26 14:26:29
【问题描述】:

我的 CakePHP 模型中有以下方法:

public function login($login,$password){

    $arr = $this->find('first',array(
        'conditions' => array(
            'deleted' => 0,
            'online' => 1,
            'login' => $login,
            'AES_DECRYPT(UNHEX(password),'secretkey')=\''.$password.'\''
        )
    ));


    return $arr;
}

此方法接受两个参数($login、$password)来验证用户。

我想知道这种方法对 SQL 注入和其他攻击是否安全。

如果不是,使用 CakePHP 清理输入参数的最佳方法是什么?

我看到 Sanitize 类在 2.4 中已被弃用。

【问题讨论】:

    标签: php cakephp sanitize


    【解决方案1】:

    Model::find() 只有正确使用才安全!

    您必须知道,只有 key => value 对中的值被转义,键和非/数字键值按原样插入到 SQL 查询中!

    引用自文档

    CakePHP 只对数组值进行转义。您永远不应该将用户数据放入密钥中。这样做会使您容易受到 SQL 注入的攻击。

    http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

    所以你的find() 调用是不安全的并且容易被SQL 注入,它应该看起来像这样:

    $arr = $this->find('first',array(
        'conditions' => array(
            'deleted' => 0,
            'online' => 1,
            'login' => $login,
            'AES_DECRYPT(UNHEX(password),\'secretkey\')' => $password
        )
    ));
    

    这样用户输入的$login$password 就被正确转义了。

    【讨论】:

      【解决方案2】:

      $Model->find应该是安全的,因为它会在进行sql查询之前转义数据。

      http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping

      【讨论】:

        【解决方案3】:

        最好的方法是使用内置的 CakePHP 身份验证来为您完成工作(请参阅文档:http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

        但是如果你需要做你自己的登录功能,如果你使用像 save()find() 这样的内置方法,Cakephp 会转义所有参数,...所以,是的,你的 @987654325 @ 方法是安全的。 (由这里的文档证明:http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping

        对于手工构建的自定义 sql,您必须手动转义参数,因为 Cakephp 不会转义它们

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-10
          • 2020-04-14
          • 1970-01-01
          • 1970-01-01
          • 2015-04-10
          • 2016-03-08
          • 1970-01-01
          相关资源
          最近更新 更多