何时是使用 mysql_real_escape_string 的正确时间?
当我使用 isset(mysql_escape_string($_GET['param'])) 时,我应该使用它吗?
当我使用 $foo = mysql_real_escape_string($_GET['bar']); 时我应该使用它吗?
谢谢
何时是使用 mysql_real_escape_string 的正确时间?
当我使用 isset(mysql_escape_string($_GET['param'])) 时,我应该使用它吗?
当我使用 $foo = mysql_real_escape_string($_GET['bar']); 时我应该使用它吗?
谢谢
您需要在使用字符串文字构建 SQL 查询时调用此函数。
你不应该在其他任何地方调用它。
调用此函数的目的是防止您执行 SQL 之类的SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'
。
mysql_real_escape_string
将转义'
字符,以便将邪恶的字符串完全视为字符串。
只要您不信任在 mysql 查询中插入的数据,就应该使用它来防止 sql 注入。例如所有用户表单数据。在你的第一个例子中:不。第二个示例:是的,如果您要在查询中使用 $foo 变量。
每当您将数据插入数据库查询(POST/GET 数据)时,都应该使用它,但如果您只需要检查数据,则不需要。
每当您从要在查询中使用的用户输入时,您都可以使用 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 确实允许一次执行两个或多个语句。