这对SQL注入是否足够安全

时间:2011-10-31 13:20:22

标签: php sql code-injection

我刚刚阅读了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;
}

4 个答案:

答案 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)

好吧,上面的所有答案都忽略了这一点。

    只要您的数据编码是utf-8或任何单字节编码,
  1. addslashes()就足够了。
  2. 但是尽管使用了这个功能,整个方法仍然是完全错误
  3. 大量逃避$ _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