在WHERE子句中使用等式语句的数字在SQL中是什么意思(WHERE 2> 1)?

时间:2017-12-11 22:36:41

标签: mysql sql ruby-on-rails

我正在查看Rails指南,并且在防止SQL注入的部分中,他们声明黑客可以注入以下代码(source):

SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1

它在Rails指南中说:

  

这将只是找到数据库中的第一条记录,并授予   访问此用户。

有人可以解释一下SQL中用来描述数字查询的总体术语(所以我知道如何谷歌更多信息),以及它如何在上面的例子中绕过身份验证?

1 个答案:

答案 0 :(得分:2)

假设您要检查密码的初始SQL是:

SELECT * FROM users WHERE login = 'LOGIN' AND password = 'PASSWORD' LIMIT 1

用户可以通过LOGIN ="' OR' 1' =' 1"和密码="'或' 2'>' 1"

这将使您的SQL语句如下:

SELECT * FROM users WHERE
login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1

让我们分解SQL中的WHERE子句。

  

登录=''或者' 1' =' 1'和密码=''或' 2'>' 1'

     

(登录=''或' 1' =' 1')和(密码=''或' 2'>' 1&#39)

登录=''可能是假的,但1 = 1将永远是真的。 密码相同=''将是假的,但是2> 1永远是真的。 所以我们得到:

  

(false OR true)AND(false OR true)

总是如此。因此,最后使用LIMIT,您将从表中获得1条记录。

基本上,由于从变量LOGIN中注入了SQL,人们可以更改SQL Query的逻辑,这样他就不需要知道用户的密码甚至用户名来获取查询返回一行可能会导致成功登录。