1

何时是使用 mysql_real_escape_string 的正确时间?

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

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

谢谢

4

4 回答 4

1

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

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

于 2011-06-05T15:31:45.763 回答
0

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

于 2011-06-05T15:33:20.623 回答
0

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

于 2011-06-05T15:33:39.420 回答
-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!

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

在此处输入图像描述破码

$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 确实允许一次执行两个或多个语句。

于 2011-06-05T16:30:04.417 回答