在SQL注入中,为什么要使用0或1 = 1,这不是在布尔运算中自动计算为1吗?我不明白为什么我们应该这样写。有人可以解释一下吗?
提前致谢
答案 0 :(得分:4)
因为它使条件始终为真。
例如,如果有人的SQL代码是:
string query = "SELECT * FROM Users WHERE Password = '" + somePassword + "'";
(为简洁起见省略了用户名子句。)
然后你可以输入这样的密码:
' OR 1 = 1;--
哪会产生查询结果:
SELECT * FROM Users WHERE Password = '' OR 1 = 1;--'
分号结束语句,--
表示注释,因此忽略其后的所有内容。所以它简化为:
SELECT * FROM Users WHERE Password = '' OR 1 = 1
这将匹配表中的所有记录。总是。因为1 = 1
总是如此。根据应用程序处理此响应的方式,您可能已登录。甚至可能是表中的第一个用户,可能是管理员用户。
对于SQL注入代码,它基本上是一个通用密码。 (如果你猜错了正确的用户名,那就不难了。)
修改:我刚刚注意到您问题的0
部分。当您希望注入的值要查找数字而不是字符串时,将使用此方法。例如,考虑类似的SQL语句:
string query = "SELECT * FROM Users WHERE Id = " + someID;
注入值中的前导0
可防止语法错误。因此得到的查询将是:
SELECT * FROM Users WHERE Id = 0 OR 1 = 1
与上述相同的概念。这将每次匹配所有记录。
答案 1 :(得分:0)
以下是对此的简要说明: -
从新闻中选择标题,文字,其中id = $ id
在上面的例子中,变量$ id包含用户提供的数据,而余数是程序员提供的SQL静态部分;使SQL语句动态化。
由于构造方式,用户可以提供精心设计的输入,尝试使原始SQL语句执行用户选择的进一步操作。下面的示例说明了用户提供的数据“10或1 = 1”,更改了SQL语句的逻辑,修改了添加条件“或1 = 1”的WHERE子句。
从新闻中选择标题,文本,其中id = 10或1 = 1
所以查询仍然会被执行