我正在阅读有关sql的书,我看到一些使用or / and的语句,但我不理解它们:
这是主要声明:
SELECT ∗
FROM administrators
WHERE username = ’’ AND password = ’’;
如果有人尝试执行sql绕过,他会这样做:
SELECT ∗
FROM administrators
WHERE username = ” OR ‘1’=‘1’ AND password = ”;
或此
SELECT ∗
FROM administrators
WHERE (username = ’’) OR (‘1’=‘1’ AND password = ’’);
这两个语句如何获得相同的结果,我不理解AND / OR在这些语句中如何工作..
最后一个问题是这些语句如何返回数据库中的所有值(绕过auth):
select *
from users
where (username = '') or (1=1) or (1=1 AND password = '') ;
OR
SELECT ∗
FROM administrators
WHERE username = ’’ AND
password = ’’ OR
1’=‘1’;
答案 0 :(得分:0)
简单的解释:
SELECT ∗ FROM administrators WHERE username = ” OR ‘1’=‘1’ AND password = ”;
如果用户名存在并且密码错误,它将返回该用户名的所有列,否则不返回任何内容。
SELECT ∗ FROM administrators WHERE (username = ’’) OR (‘1’=‘1’ AND password = ’’);
返回与上面相同的内容,括号没关系。
SELECT ∗ FROM administrators WHERE username = ’’AND password = ’’ OR ‘1’=‘1’ ;
这有所作为,即使用户名和密码都错误,它也会返回完整的*列。 [用于全表数据的SQL注入的最佳选择]
select * from users where (username = '') or (1=1) or (1=1 AND password = '') ;
与上述结果相同
以这种方式很容易想到它:
在where之后引入的任何AND / OR条件与第一个约束条件配对,在此之后引入的任何其他条件都是其自身的约束条件。
WHERE condition1 OR/AND condition1-pair AND separate condition
答案 1 :(得分:0)
您可以将AND视为乘法,或将OR视为加法,将true语句视为1,将false语句视为0。例如,语句
SELECT .... WHERE y = 0 AND x < 1 OR 1 = 1
will always be true, because
1*1 + 1 = 1
0*0 + 1 = 1
1*0 + 1 = 1
(0和1是布尔值,不是十进制)