我的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已被弃用。
答案 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转义