@mritd
2016-03-14T13:48:46.000000Z
字数 482
阅读 1650
Java
今天群里哥们偶尔问道一个问题,顺便查查找到了答案,记录一下。
问题大致如下:
SQL1
SELECT * FROM TABLE WHERE NAME='ZHANGSAN' OR 1=1 OR '1'='1' AND AGE=10;
SQL2
SELECT * FROM TABLE WHERE NAME='ZAHNGSAN' OR 1=1 AND AGE=10;
两条SQL,第一条返回全表结果集,第二条返回 NAME='ZHANGSAN'
或者 AGE=10
的结果集;问两条SQL为何会这样。
以前一直没留意过,搜了下资料,大致原因如下:
在 SQL 中,OR
关键字的优先级会比 AND
关键字优先级要高,OR
关键字会将条件切分成前后两部分,大致表现如下:
SQL1
SELECT * FROM TABLE WHERE (NAME='ZHANGSAN') OR ((1=1) OR ('1'='1' AND AGE=10));
所以在第一个 OR
分割后,后面又进行了二次分割;此时后面由于 ('1'='1')
始终为真,则后半部分一直返回为真,此时第一个 OR
分割整体也会返回为真,造成查出整个表的结果集;SQL2同理一样。