这会阻止SQL注入吗?

wub*_*bbe -2 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";
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 9

这里是绝对没有理由试图避免SQL注入时使用白名单/黑名单.使用mysqli_没有预处理语句的函数时,您需要做的就是使用mysqli_real_escape_string().

但是,您最好不要学习准备好的语句.它们比逃逸更清洁,更安全.

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

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

由于您不理解该示例,这里有一个详细的解释:

  • 第1行准备声明.您可以?在任何时候使用外部数据.
  • 第2行绑定s第一个占位符的string()参数.所以$username应该包含(不受信任的)值
  • 第3行使用先前绑定的参数执行语句.SQL和数据是单独传输的,因此没有SQL注入风险.

  • 请尝试理解它.任何必须在以后使用您的代码的人都会爱你.而你*将*忘记逃避一些争论,从而打开一个安全漏洞.如果您需要一些帮助,了解如何使用预准备语句,请随意加入[PHP聊天室](http://chat.stackoverflow.com/rooms/11/php). (4认同)