当查询中的变量没有引号时,是否可以使用mysql_real_escape_string进行SQL注入?

时间:2011-08-25 21:05:10

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

以此为例

$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$sql = "SELECT * FROM users WHERE username = $username AND password = $password";

如果$ username和$ password周围没有引号,是否还可以注射?

3 个答案:

答案 0 :(得分:3)

  

如果$ username和$ password周围没有引号,是否还可以注射?

是。 mysql_real_escape_string()仅阻止从字符串中的引号中转义。

如果没有引号,mysql_real_escape_string()就没用了。

答案 1 :(得分:1)

是。平凡地,提交用户名作为用户名,密码作为密码。恭喜你,你在。那是因为这扩展到:

$sql = "SELECT * FROM users WHERE username = username AND password = password";

它会选择username列等于username列的任何行(密码相同)。

当然,此代码也无法进行普通登录,因此应该很快就能抓住它。如果您使用任何用户名或密码而不是数据库构造(列,函数调用等),它将失败。

答案 2 :(得分:0)

如果没有引号,用户提交的数据将被视为字段引用和/或无效的SQL。

考虑用户名username。一个正确的查询是:

SELECT ... FROM ... WHERE username='username'

并且只有在确实存在名称为"用户名"。

的用户时才匹配

没有引号,它变为:

SELECT ... FROM ... WHERE username=username

将匹配表中的所有非空记录。

现在考虑一个由两部分组成的用户名:John doe

SELECT ... FROM ... WHERE username=John doe

数据库服务器会尝试将用户名字段与字段名称' John'进行比较,这很可能不存在。然后就是这个" doe"那里的东西不是字段名,不是SQL关键字,所以是语法错误。

现在考虑用户名:1 or 1=1

SELECT ... FROM ... WHERE username=1 or 1=1

再次,这将始终返回true并匹配所有行,因为" 1 = 1"永远都是真的。

mysql_real_escape_string()只保证你传递给它的任何数据都不会打破"正确构造的查询。如果未正确构建您要将转义数据插入的查询,则所有投注均已关闭。