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)
这里是绝对没有理由试图避免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)
由于您不理解该示例,这里有一个详细的解释:
?在任何时候使用外部数据.s第一个占位符的string()参数.所以$username应该包含(不受信任的)值