You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'-'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:53:20