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

为何双短横线(--)会使MariaDB的条件子句判定为真?

MySQL/MariaDB中无空格--的解析规则及注入成功原因

核心规则说明

MySQL及其分支(包括MariaDB)对--注释的判定有严格要求:只有当--后面紧跟空格、换行或其他空白字符时,才会被识别为单行注释。如果--后面没有空白字符,它会被解析成两个连续的一元负号运算符,而非注释或字符串的一部分。

注入成功的具体逻辑

学生构造的查询语句是:

SELECT * FROM users WHERE username='admin' AND password=''--'';

其中password=''--''会被数据库解析成如下表达式:

password = ('' - (-''))

一步步拆解:

  1. 空字符串''在与数字运算时,会被MySQL隐式转为数字0;
  2. 连续的两个-是一元负号,-''等价于-0,结果还是0;
  3. 整个表达式简化为password = 0 - 0,也就是password = 0;
  4. 当字符串类型的密码(比如admin的'S3cur3P4ssw0rd!')和数字0比较时,数据库会自动把字符串转成数字:如果字符串开头没有有效数字,转换结果就是0;
  5. 这样password = 0的判定结果为真,再加上username='admin'的条件,自然就能查询到admin用户。

对应测试用例的验证

结合给出的测试场景:

  • password='':直接匹配空字符串,和admin的非空密码不对应,返回0结果;
  • password=''-- '':--后面有空格,被识别为注释,等价于password='',同样返回0结果;
  • password=''--;:解析为password = '' - -;,;直接结束语句导致表达式缺少操作数(或视为匹配字符串--;),和admin密码不匹配,返回0结果;
  • password=''--1;:解析为password = '' - -1,计算结果是1,admin密码转成数字是0,0≠1,条件不成立,返回0结果。

内容的提问来源于stack exchange,提问作者Wrench

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:35:12