2

可能重复:
在 PHP 中防止 SQL 注入的最佳方法

我想知道 sql 注入并想知道何时使用 mysqli_real_escape_string。

每次我的查询中有 WHERE 子句时都需要使用它吗?

4

3 回答 3

3

对于来自用户或不可信的任何数据,您应该使用 mysqli_real_escape_string。

于 2012-07-25T15:23:43.690 回答
0

当您在查询中包含 $_REQUEST "vars" 时,您必须使用它,例如。

 $query = "UPDATE foo set bar = '{$_GET['var']}' ..."

 $query = "INSERT INTO foo ('{$_POST['var']}',) ..."

 $query = "SELECT bla from foo WHERE bar = '{$_COOKIE['var']}'"

每个查询都必须是 mysqli_real_escape_string 才能提供注入...

于 2012-07-25T15:25:54.157 回答
0

您使用mysqli_real_escape_string它或它的任何变体来确保来自任何用户输入字段的数据被正确转义。

例如,您有一个包含几个输入的表单。您单击提交,数据将作为请求发送到您的 PHP 脚本。在您的脚本中,您将用户发布的值插入数据库。

例如,如果用户在用户登录时在输入字段中键入以下内容:

' WHERE `username` = {x} AND password > 1;

该人有可能拥有您正在使用的表中的所有数据。使用:

mysqli_real_escape_string($input)

将产生上述内容:

\' WHERE `username` = {x} AND password > 1;

' 上的转义字符串将阻止可能的 SQL 注入攻击。

也就是说,您没有理由使用mysqli_real_escape_string()PDO,并且绑定参数在转移许多不同的 SQL 攻击/注入方法方面要优越得多。学习并使用它!

因评论而编辑

%并且_还需要特殊处理mysqli_real_escape_string()

function escape_extra_chars ( $string )
{
    $string = preg_replace("/\%/", "\%", $string);
    $string = preg_replace("/\_/", "\_", $string);

    return $string;
}

无论如何(该功能未经测试)

于 2012-07-25T15:30:52.920 回答