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

输入引号至codContract参数触发数据库错误,是否为可利用SQL注入?

这是可利用的SQL注入漏洞,不是误报

首先可以明确:这个错误绝非误报,你的应用确实存在SQL注入风险,触发的错误正是参数未被安全处理的直接证据。下面详细分析:

错误根源分析

从你提供的执行SQL能看到核心问题:

WHERE Cod_Contract = TEST

这里的TEST没有被单引号包裹,说明你的应用是直接将用户输入的参数值拼接到SQL字符串中,而不是使用数据库预编译语句(绑定变量)。正常处理字符串类型参数时,应该自动用单引号包裹,并且对参数内的引号做转义(比如把'替换成'')。

当你输入"TEST作为参数值时,拼接后的SQL条件变成了:

WHERE Cod_Contract = "TEST

在Oracle语法中,双引号是用来**引用标识符(列名、表名等)**的,所以数据库会把"TEST"当作一个列名去查找——但你的表中显然不存在这个列,而且如果构造的标识符长度超过Oracle规定的30字符上限,就会触发ORA-00972: identifier too long错误。

为什么这是SQL注入漏洞

这种直接拼接参数的写法,完全是SQL注入的温床:

  • 攻击者可以构造恶意参数修改SQL逻辑,比如输入' OR 1=1 --,拼接后的条件会变成:
    WHERE Cod_Contract = '' OR 1=1 --
    
    这会让WHERE条件恒成立,返回所有符合其他过滤规则的数据。
  • 更危险的是,如果数据库账号具备足够权限,攻击者还可以构造注入语句执行删除数据、修改表结构甚至执行系统命令等操作。

修复建议

  • 立即替换为预编译语句(PreparedStatement),或者在MyBatis中使用#{codContract}(而不是${codContract})进行参数绑定,让数据库自动处理参数的转义和包裹,从根源上避免SQL注入。
  • 永远不要直接将用户输入拼接到SQL语句中,哪怕做了简单的字符串替换也存在绕过风险,绑定变量是最可靠的防护方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:25:38