首页 >数据库 >mysql教程 >`mysqli_real_escape_string` 足以防止 SQL 注入吗?

`mysqli_real_escape_string` 足以防止 SQL 注入吗?

DDD
DDD原创
2024-12-17 20:30:19224浏览

Is `mysqli_real_escape_string` Sufficient to Prevent SQL Injection?

mysqli_real_escape_string 足以防止 SQL 注入吗?

问题:

在提供的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn