一个过时的SQL注入预防器


An outdated SQL-injection preventer?

在我找到的登录脚本中,创建者添加了这个函数来防止SQL注入攻击。

function Fix($str) {
    $str = trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

由于我读到magic_quotes_gpc已被(或已经)删除,感觉这个功能有点过时了。仅仅使用mysqli_real_escape_string($user_input)不会增加足够的安全性吗?

mysql_real_escape_string在所有

情况下都不够,但它绝对是非常好的朋友。更好的解决方案是使用预准备语句

//example from http://php.net/manual/en/pdo.prepared-statements.php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

另外,不要忘记可用于丢弃任何无效/可疑字符的 HTMLPurifier

mysql_real_escape_string() 与预准备语句

mysql_real_escape_string()容易 影响同一类型的问题 addslashes() .

Chris Shiflett(安全专家)的回答

magic_quotes_gpc

5.3 中被弃用,在 5.4 中被删除。如果你的代码是用于分发的(即你无法控制使用它的环境),最好考虑它在启用魔术引号的情况下在 5.3 中运行的可能性。如果这是内部应用程序,并且您可以控制环境,并且您知道魔术引号被禁用,则没有必要检查它们。