这是什么意思?
SELECT * from users where password = ''*'';
如果我在mysql workbench中检查这个,我只得到一行,尽管表中有很多用户。
这究竟选择了什么?
答案 0 :(得分:6)
有趣的问题。让我们看看''*''
做了什么。
mysql> select ''*'';
+-------+
| ''*'' |
+-------+
| 0 |
+-------+
让我们创建一些用户:
mysql> select * from users;
+------+-------+
| id | name |
+------+-------+
| 1 | joe |
| 2 | moe |
| 3 | shmoe |
| 4 | 4four |
+------+-------+
测试我们的查询:
mysql> select * from users where name = ''*'';
+------+-------+
| id | name |
+------+-------+
| 1 | joe |
| 2 | moe |
| 3 | shmoe |
+------+-------+
有趣的是,用户4未被选中!但是让我们这样试试:
mysql> select * from users where name = 4;
+------+-------+
| id | name |
+------+-------+
| 4 | 4four |
+------+-------+
那么,我们可以从中扣除什么呢?
''*''
不知何故意味着0(我对mysql字符串运算符不是那么流利,所以让我们把它当成事实); password
以0开头或非数字。答案 1 :(得分:5)
'' * ''
答案 2 :(得分:4)
''*''
是一个乘法:它的两个参数(空字符串)被转换为数字(即0),结果为0.然后,等式的左边也被转换为数字,这将是有时为零(当密码不能被评估为非零数字时),有时不是。
这有点模糊,您可以问自己这是针对您的情况还是意外行为,而实际意图是测试'*'
。意图不好的用户可能已输入'*'
作为密码,希望您没有受到SQL注入保护,以便在没有有效密码的情况下进入系统。