我刚刚阅读了SQL注入,并在我正在阅读的博客上找到了这个功能
我想知道SQL注入是否安全..如果我将remove_mq($_POST)
传递给它,我可以在查询中使用$_POST["var"]
而没有问题吗?
function remove_mq($array){
foreach($array as $key => $value){
if(is_array($value)){
$array[$key] = remove_mq($value);
}
else{
$array[$key] = addslashes($value);
}
}
return $array;
}
答案 0 :(得分:5)
没有。 Addslashes不是为查询转义的正确函数。您需要使用mysql_real_escape_string
除此之外,在实际使用查询中的值之前,您应该不执行SQL转义。假设您有类似<input name="foo" value="$_POST[foo]"
的内容 - 那么您需要它htmlspecialchars()
- 转义而不是addslashes
(等等) - 转义
除此之外,最好的解决方案是将PDO
与预准备语句一起使用,因为您将SQL查询与params分开,因此您根本不需要任何转义。
答案 1 :(得分:2)
现在的最佳做法是准备好查询。 例如:
$stmt = $pdo->prepare('SELECT username FROM users WHERE id = :id');
$stmt->execute(array(':id' => $_GET['id']));
$result = $stmt->fetchAll();
此代码完全安全
答案 2 :(得分:2)
好吧,上面的所有答案都忽略了这一点。
addslashes()
就足够了。大量逃避$ _POST是没有意义的,并不能保证完全保护 没有addslashes或mysql_real_escape_string做任何实际的保护。它与字符串分隔符一样少。所以,你必须使用这个功能:
所有其他必需的操作都在注释
的链接中描述以及那些在此事上受过极大教育的人的一些信息:
您心爱的PDO,开箱即用时,请使用相同的defamed addslashes
答案 3 :(得分:1)
不 - 只需使用内置功能吧! mysql_real_escape_string()
总是比你自己写的任何函数更可靠。
Here's an article解释了为什么要mysql_real_escape_string
使用addslashes
。
当然,最好的方法是使用准备好的查询。 Here's some information on them