SQL注入登录绕过语法疑问:单引号作用与语句有效性解析
SQL注入绕过验证的语法逻辑解析
先明确后台最常见的登录验证SQL结构(这是理解问题的核心):
SELECT * FROM users WHERE username = '$username' AND password = '$password'
这里的$username和$password是接收用户输入的参数,后台会自动用单引号把输入内容包裹起来。
关于user后加单引号的原因
输入user'的核心作用是闭合后台SQL中包裹用户名的前置单引号。如果不加这个单引号,输入user OR '1'='1'会被拼接成:
SELECT * FROM users WHERE username = 'user OR '1'='1'' AND password = '$password'
此时整个用户名参数被当成了一个完整字符串user OR '1'='1',SQL只会去匹配用户名完全等于这个字符串的记录,根本不会解析OR逻辑,自然无法绕过。
而加了单引号后,拼接后的SQL变成:
SELECT * FROM users WHERE username = 'user' OR '1'= '1' AND password = '$password'
这里'user'闭合了前置单引号,OR被当成逻辑运算符生效,后面的恒真条件开始发挥作用。
关于第二个1只加前单引号的原因
后台SQL会自动给$username参数加上后置的闭合单引号。输入的内容最后是'1,加上这个后置单引号后,刚好补全为'1',形成完整的恒真表达式'1'='1'。
如果输入的是完整的'1'='1',拼接后的SQL会变成:
SELECT * FROM users WHERE username = 'user' OR '1'='1'' AND password = '$password'
最后多了一个多余的单引号,会直接导致SQL语法错误,语句执行失败,自然无法绕过验证。
为什么整数/字符类型不影响结果
这里的'1'='1'是字符串恒等比较,SQL会将其解析为布尔值true。而OR逻辑只要任意一个条件为真,整个WHERE子句就为真,和用户名字段是整数还是字符类型无关——不管字段类型是什么,这个恒真表达式都会让整个条件成立,从而绕过验证。
内容的提问来源于stack exchange,提问作者Turing'-'
相关产品推荐
相关产品推荐

