这会阻止SQL注入吗?

时间:2013-01-20 13:59:17

标签: php mysql code-injection

下面的代码是否更好地防止MySQL数据库上的SQL注入比mysqli_real_escape_string更好?

$str = "SELECT * FROM customers WHERE username = '; DELETE FROM customers WHERE 1 or username = '";
$str2 = "";

for($i = 0; $i < strlen($str); $i++)
{
    if (strpos ("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!0123456789", $str[$i], 0) !== FALSE)
    {
        $str2 = $str2 . $str[$i];
    }
}

echo "$str2";

3 个答案:

答案 0 :(得分:9)

绝对没有理由在尝试避免SQL注入时使用白名单/黑名单。在没有预处理语句的情况下使用mysqli_函数时,您需要做的就是使用mysqli_real_escape_string()处理数据。

但是,您最好不要学习prepared statements。它们比逃避更清洁,更安全。

使用预准备语句执行示例查询的代码如下所示:

$stmt = $conn->prepare('SELECT * FROM customers WHERE username = ?');
$stmt->bind_param('s', $username);
$result = $stmt->execute();

由于你不理解这个例子,这里有一个详细的解释:

  • 第1行准备声明。只要您想使用外部数据,就可以使用?
  • 第2行为第一个占位符绑定字符串(s)参数。因此$username应包含(不受信任的)值
  • 第3行使用先前绑定的参数执行语句。 SQL和数据是分开传输的,因此没有SQL注入风险。

答案 1 :(得分:2)

  

下面的代码是否比mysqli_real_escape_string更能防止mysql注入,还是无关紧要?

都不是。情况更糟,你不应该这样做!你没有逃避(!)数据(!!),而是破坏了整个查询。

简而言之,它将

  1. 使有效查询无效
  2. 不阻止恶意查询
  3. 即使您只是对数据应用方法,也不对整个查询应用,

    1. 弄乱你的数据
    2. 不会阻止各种SQL注入

答案 2 :(得分:1)

阅读this article。在用户评论的底部,您会发现许多有用的SQL注入预防技巧和提示。 但是,第一步是在将数据插入查询之前验证和清理您的GET / POST数据。