我是一名开始研究应用程序安全的软件开发人员,我对 SQL 注入有以下疑问。
我正在关注视频课程,有以下两个示例:
我有一个不安全的 SQL 查询,如下所示:
txtSql = "SELECT * FROM Users WHERE UserId = " + txtUserId
如果传递的值
txtUserId
类似于99 OR 1 = 1
,我将获得这样的查询SELECT * FROM Users WHERE UserId = 99 OR 1 = 1
这将返回表中包含的整个记录列表,
Users
因为1 = 1
它始终为真,并且OR
连接将返回真,所以就像这个查询:SELECT * FROM Users WHERE TRUE
将整个记录列表返回给我。这个推理正确吗?
然后我有第二个更复杂的例子:
有一个用户登录表单(用户名和密码)。这种形式的背后有这个不安全的查询实现:
sql = 'SELECT * FROM USERS WHERE Name = "' + uName + '" AND Pass = "' + uPass + '"'
如果用户在登录表单中插入以下数据:
uName = " OR ""=" uPass = " OR ""="
结果查询将是:
SELECT * FROM Users WHERE Name = "" OR ""="" AND Pass = "" OR ""=""
所以它正在选择记录
该
Name
字段为空 ("") 或等于"="
(并且此条件应始终为 false,因为拥有空用户名或像“=”这样的用户名是很奇怪的)。该
Pass
字段为空 ("") 或等于"="
(并且此条件应始终为 false,因为使用空密码或类似“=”的密码是很奇怪的)。
所以我们有一个像这样的条件:
WHERE FALSE AND FALSE
这是我的疑问:
FALSE AND FALSE = FALSE
为什么它说这个查询返回了用户表的整个记录列表?
如果我理解正确的逻辑,第二个查询应该翻译成这样的:
SELECT * FROM Users WHERE FALSE AND FALSE
我的推理有什么问题?我错过了什么?