什么时候使用mysql_real_escape_string?
当我使用isset(mysql_escape_string($ _ GET ['param']))时,我应该使用它吗,
当我使用$ foo = mysql_real_escape_string($ _ GET ['bar'])时,我应该使用它吗?
由于
答案 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!
这是不起作用的示例代码:
代码破碎
$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允许一次执行两个或更多语句。