我是一名软件开发人员,开始研究应用程序安全性,并且与SQL注入相关的问题与以下内容有关。
我正在观看视频课程,并且有以下两个示例:
1)我有一个不安全的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始终为true,而OR串联将返回true,因此类似于此查询:
SELECT * FROM Users WHERE TRUE
返回了整个记录列表。这个推理正确吗?
2)然后有第二个更复杂的示例:
有一个用户登录表单(用户名和密码)。该表格的后面是这种不安全的查询实现:
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
这里是我的疑问:假与假=假
为什么说这个查询返回我用户表记录的整个列表?
如果我很好地理解了逻辑,则先前的查询应以如下形式翻译:
SELECT * FROM Users WHERE FALSE AND FALSE
我的推理有什么问题?我想念什么?
布尔逻辑的优先顺序是非与或,因此您要求
WHERE Name = "" OR (""="" AND Pass = "") OR ""=""
现在您得到
WHERE FALSE OR FALSE OR TRUE
导致TRUE
agian
告诉我,是"blank"="blank"
吗?如果您的评论为“是”,那是您的答案。