以此为例
$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周围没有引号,是否还可以注射?
答案 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()只保证你传递给它的任何数据都不会打破"正确构造的查询。如果未正确构建您要将转义数据插入的查询,则所有投注均已关闭。