这只是一种好奇心。如果在将密码插入查询之前加密密码(使用sha1或其他方法),那么它必须进行清理?或者哈希的结果总是安全吗?
这个简单的代码是安全的吗?
$salt = "123xcv";
$password = $_POST['password'];
$password = sha1($password+$salt);
$query = "select * from user where password='$password'";
答案 0 :(得分:2)
这个sql注入问题问题是出于一个常见的错觉。
事实上,根本没有像“消毒”这样的东西,也没有执行这种不存在的任务的任何功能。同时没有“安全”或“不安全”的数据。只要您遵循简单的规则,每个数据都是“安全的”。
更不用说程序员要记住更重要的事情,除非某些特定数据在某些特定情况下是“安全的”。
你真正需要的是,是为了在所有中使用原始SQL来避免这种愚蠢的查询,使用ORM为你运行SQL。在极少数情况下,当您确实需要运行复杂查询时,必须使用占位符替换查询中的每个变量。
答案 1 :(得分:1)
除非您以某种方式验证输入,否则您不应该假设它将始终返回安全输出,因为如果给出意外输入,SHA1等函数可以返回错误值。例如:
echo '<?php echo sha1(''); ?>' | php
Warning: sha1() expects at least 1 parameter, 0 given in - on line 1
这个输出显然违反了“它始终是十六进制字符串”的假设。其他语言中的其他散列函数可能会出现另一种行为。
除此之外,上面的密码哈希码方案($password = sha1($password+$salt);
)非常弱(see why),我强烈建议不要使用它,即使在示例中也是如此有人最终会保证在StackOverflow上找到它并在生产中使用。
另外,如上所述,通过连接字符串来构建SQL查询也是一种不好的做法,并且可能在将来导致安全问题:今天查询中唯一的参数将是密码,明天有人决定添加其他选项我打赌他们不会重写查询,只是使用已经存在的模板......
答案 2 :(得分:0)
该值以40个十六进制数字的字符串形式返回,如果参数为NULL,则返回NULL。
假设您有足够大的varchar
列,则无法进行清理。
这就是说,使用prepared statements总是更干净,没有理由只是连接字符串来构建查询。