为什么SELECT * FROM users WHERE password='a'='mm';
实际返回行?
为什么SELECT * FROM users WHERE password='1'='1';
不起作用?
使用的完全相等的运算符比较规则是什么?
更新(表格和行等信息):
mysql> show tables;
+------------------+
| Tables_in_shengy |
+------------------+
| users |
+------------------+
1 row in set (0.00 sec)
mysql> describe users;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(255) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| victim | 123456 |
+----------+----------+
1 row in set (0.00 sec)
答案 0 :(得分:4)
MySQL将比较转换为0
和1
。
因此password='a'
评估为0
(除非password
实际上 'a'
)。
MySQL也试图通过将字符串从头开始转换为数字来对字符串和数字进行比较。
因此0abc
会转换为0
。 abc
根本不是一个数字,也是0
。
这意味着
password='a'='mm'
结果
0='mm'
由于mm
没有任何前导数字,因此
0=0
这是真的。