【发布时间】:2014-04-19 11:25:44
【问题描述】:
我有user_info表描述如下
Field Type null Type Extra
usr_id int(11) NO PRI auto_increment
f_name varchar(50) NO
l_name varchar(50) YES
user_name Varchar(45) NO
password varchar(128) NO
email varchar(50) NO
type enum('a','s','c') NO
表格内的数据
0 admin admin admin d033e22ae348aeb5660fc2140aec35850c4da997 admin@oww.com a
1 staff Staffer staff d033e22ae348aeb5660fc2140aec35850c4da997 staff@oww.com s
2 staff2 stafer staff2 d033e22ae348aeb5660fc2140aec35850c4da997 staff2@oww.com s
10 Shanoop Pattanath shan123456 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 shan@shan.com s
SQL 查询
SELECT
*
FROM
(`user_info`)
WHERE
`user_name` = 0 -- wrong input
AND `password` = 0 -- wrong input
ORDER BY `usr_id`;
此查询的结果
0 admin admin admin d033e22ae348aeb5660fc2140aec35850c4da997 admin@oww.com a
1 staff Staffer staff d033e22ae348aeb5660fc2140aec35850c4da997 staff@oww.com s
2 staff2 stafer staff2 d033e22ae348aeb5660fc2140aec35850c4da997 staff2@oww.com s
这个查询怎么会匹配所有数据?这个查询不应该给出任何结果,不是吗?我在这里做错了什么?详细的答案非常感谢MySQL ver : 5.5.35-0ubuntu0.13.10.2 (Ubuntu)。 SQL FIddle
所有用户名、密码和电子邮件都是虚构的
更新
我知道0 必须在引号内。我通过这样做解决了这个问题。但是 MySQL 怎么会给出这个有线输出。 ?
【问题讨论】:
-
喜欢你的问题....非常好和奇怪的查询输出
-
在 0 (
'0') 周围添加引号可以解决问题,您应该这样做。 -
@user1153551 这几乎在我的网站中造成了巨大的安全问题。我找到SQL注入的新方法了吗?
-
@FDL 我知道,但为什么会给出这个结果?
-
因为您将整数与字符串值进行比较。很可能当 SQL 将字符串转换为整数进行比较时,它会转换为 0。然后匹配。