为什么MySQL中MyColumn=''=''的WHERE子句会返回所有行
语法不报错的原因
MySQL、MariaDB的比较运算符=遵循左结合规则,同优先级运算符会从左到右依次运算,因此MyColumn=''=''不会被判定为语法错误,会被解析为等价的(MyColumn = '') = ''表达式。
返回全表数据的原因
整个表达式的计算逻辑结合MySQL的隐式类型转换规则,对绝大多数行都会返回真值:
- 首先运算左半部分
MyColumn = '':布尔比较的结果在MySQL中会以数字形式返回,匹配成功返回1(对应TRUE),匹配失败返回0(对应FALSE)。 - 再将第一步得到的数字结果和空字符串
''做等于比较:MySQL跨类型比较时会触发隐式转换,空字符串''转换为数字的结果为0:- 若
MyColumn的值不为空,第一步结果为0,0 = 0的结果为1(TRUE),该行会被返回。 - 若
MyColumn的值为空,第一步结果为1,1 = 0的结果为0(FALSE),该行不会被返回。
- 若
你观测到返回全表,通常是因为测试表的MyColumn字段没有存储空字符串的行,所有行的表达式运算结果都为真,因此被全部返回。
这种写法是常见的SQL注入闭合手段,当业务代码直接拼接用户输入构造SQL时,攻击者仅需输入'=''就能拼接出接近恒真的WHERE条件,绕开身份校验批量拉取数据。
内容的提问来源于stack exchange,提问作者Xel Naga
相关产品推荐
相关产品推荐

