问题:
在提供的 PHP 中代码,使用 mysqli_real_escape_string 是否足以防止SQL注入攻击?
$email= mysqli_real_escape_string($db_con,$_POST['email']); $psw= mysqli_real_escape_string($db_con,$_POST['psw']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES ('".$email."','".$psw."')";
答案:
不,仅仅依靠mysqli_real_escape_string不足以防止SQL注入和其他SQL攻击。
Prepared statements 为防止 SQL 注入提供了更强大的解决方案。它们将数据和指令分开,确保用户提供的输入不会干扰查询的结构。
对于无法使用准备好的语句的情况,为特定目的实施严格的白名单可以提供一些保护。这涉及为每个参数定义可接受值的预定列表,以防止恶意输入。
使用白名单和类型转换的示例:
switch ($sortby) { case 'column_b': case 'col_c': // Safe to use break; default: $sortby = 'rowid'; } $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // Execute the query using prepared statements $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
确保准备好的语句与模拟准备已关闭,特别是在使用 MySQL 时。
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
以上是`mysqli_real_escape_string` 足以防止 SQL 注入吗?的详细内容。更多信息请关注PHP中文网其他相关文章!