何时使用mysql_real_escape_string()

时间:2011-06-05 15:29:32

标签: php mysql code-injection mysql-real-escape-string

什么时候使用mysql_real_escape_string?

当我使用isset(mysql_escape_string($ _ GET ['param']))时,我应该使用它吗,

当我使用$ foo = mysql_real_escape_string($ _ GET ['bar'])时,我应该使用它吗?

由于

4 个答案:

答案 0 :(得分:1)

在使用字符串文字构建SQL查询时,需要调用此函数 你不应该在其他任何地方打电话。

调用此函数的目的是阻止您执行SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'之类的SQL mysql_real_escape_string将转义'字符,以便将邪恶字符串完全视为字符串。

答案 1 :(得分:0)

如果您不信任要在mysql查询中插入的数据以防止sql注入,则应该使用它。例如,所有用户表单数据。 在你的第一个例子中:没有。 第二个例子:是的,如果你打算在查询中使用$ foo变量。

答案 2 :(得分:0)

每次将数据插入数据库查询(POST / GET数据)时都应该使用它,但如果只是需要检查数据则不应该使用它。

答案 3 :(得分:-1)

只要您有来自要在查询中使用的用户的输入,就可以使用mysql_real_escape_string。

以下是如何使用它:

$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = '$user' AND password = '$password' ";
//the quotes are vital  !!                 ^     ^  or you will not be safe!

这是不起作用的示例代码:

enter image description here 代码破碎

$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = $user AND password = '$password' ";

在示例中,我可以通过输入任何密码登录您的系统 user or (1=1) --。这将使查询成为:

SELECT * FROM users WHERE user = user or (1=1) --  AND password = '$password

并且会批准所有登录,因为密码永远不会被检查。

使用mysql_query时,一次只能执行一个SQL语句,所以:

$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysql_query($query);

会导致错误,因为;之后不能成为一部分。

但是这段代码可行:

<强>危险

$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysqli_query($query);

因为改进的 mysqli_query允许一次执行两个或更多语句。