MySQLi 的“mysqli_real_escape_string”足以抵御 SQL 攻击吗?
您的代码尝试使用“mysqli_real_escape_string()”来防止 SQL 注入。然而,正如 uri2x 所表明的,这种措施是不够的。
SQL 注入漏洞
“mysqli_real_escape_string()”仅转义某些字符,使您的查询容易受到 SQL 攻击注入攻击。例如,以下代码仍然可能容易受到攻击:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $query = "SELECT * FROM users WHERE email = '" . $email . "'";
攻击者可以输入类似“email'@example.com”的电子邮件地址来利用查询,在转义输入后添加其他 SQL 语句。
使用准备好的语句
而不是“mysqli_real_escape_string()”,防止SQL注入最有效的方法是使用准备好的语句。预准备语句将数据与查询字符串分开,防止数据污染。
$stmt = $db_con->prepare("INSERT INTO users (email, psw) VALUES (?, ?)"); $stmt->bind_param('ss', $email, $psw); $email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $stmt->execute();
严格字符白名单
在预准备语句不可行的情况下,实施严格字符白名单可以保证安全。这涉及到过滤输入以确保它只包含允许的字符。
结论
仅“mysqli_real_escape_string()”不足以防止 SQL 注入。准备好的声明和严格的白名单提供了针对这些攻击的更强大的保护措施。
以上是`mysqli_real_escape_string()` 足以防止 SQL 注入攻击吗?的详细内容。更多信息请关注PHP中文网其他相关文章!