CakePHP清理参数

时间:2014-11-26 14:26:30

标签: php cakephp sanitize

我的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清理输入参数的最佳方法?

我发现从2.4开始,Sanitize Class已被弃用。

3 个答案:

答案 0 :(得分:1)

Model::find()只有在正确使用时才是安全的!

您必须知道只有key => value对中的值被转义,键和非/数字keyd值将按原样插入到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正在被正确转义。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

但是如果您需要自己创建登录功能,如果您使用save()find()等内置方法,那么Cakephp会转义所有参数,......所以, ,您的find()方法是安全的。 (由此处的文档验证:http://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html#sql-escaping

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