应优先复核直接拼接用户输入、未校验的request.getparameter/req.query/ctx.params值构造sql,以及orm中createnativequery或raw()调用;preparedstatement误报需确认sql模板是否动态及参数是否真绑定。

Checkmarx 扫描结果里哪些 Query 或 Execute 调用要优先人工复核
Checkmarx 默认会标记所有拼接字符串进 SQL 语句的位置,但真正高风险的其实集中在几个典型模式:直接拼接用户输入、未校验的 request.getParameter / req.query / ctx.params 值参与构造 SQL、以及 ORM 中绕过参数化机制的 createNativeQuery 或 raw() 调用。
重点盯这些位置:
-
String sql = "SELECT * FROM users WHERE name = '" + request.getParameter("name") + "'";—— 典型的硬编码单引号拼接,Checkmarx 通常标为HIGH风险 -
session.createSQLQuery(sql)或db.raw(sql)—— 即使变量名看着“安全”,只要最终执行的是动态拼接的sql字符串,就必须展开看源头 -
PreparedStatement用了但参数是setString(1, userProvidedValue)—— 这类反而是低风险,Checkmarx 可能误报,需确认是否真用了占位符而非字符串替换
为什么 PreparedStatement 有时仍被 Checkmarx 标为漏洞
Checkmarx 是基于代码结构做模式匹配,它不运行代码,所以无法判断 PreparedStatement 的 SQL 模板是否真的固定、参数是否真的来自绑定接口。常见误报场景:
- SQL 字符串本身是变量(如
String sql = getQueryTemplate(); PreparedStatement ps = conn.prepareStatement(sql);),Checkmarx 看不到getQueryTemplate()返回值,保守标为风险 - 使用了
setObject()但传入的是拼接后的字符串(如ps.setObject(1, "admin' OR '1'='1");)—— 这不是注入点,但 Checkmarx 无法区分语义,只看到“用户数据进 setXxx”就报警 - Java 中
String.format()或StringBuilder构造 SQL 后再传给PreparedStatement—— 实际已破坏参数化,Checkmarx 正确捕获,但开发者容易忽略中间这一步
如何快速验证 Checkmarx 报出的 SQL 注入点是否真实可利用
别急着改代码,先做三件事确认攻击面是否存在:
- 顺着报出的行号,找到最终拼入 SQL 的变量,往上追溯它的来源:
request.getParameter、getHeader、getCookies、JSON body 解析字段、甚至数据库查询结果二次拼接 —— 只要没经过白名单校验或强类型转换,就算潜在入口 - 检查该 SQL 是否真会执行:是不是在
if (false)分支里?是不是测试用的 mock 方法?Checkmarx 不分析控制流,可能扫到死代码 - 本地构造一个带单引号和注释符的输入(如
test' --),断点停在 SQL 拼接后、执行前,打印完整语句 —— 如果看到WHERE name = 'test' -- '这种能截断后续逻辑的结构,就是实打实的可利用点
Checkmarx 配置里必须关掉的两个默认误报项
开箱即用的 Checkmarx 规则集对 Java 和 Node.js 场景过于激进,以下两项建议在自定义 CxSAST 查询中禁用:
-
SQL_Injection_Java_PreparedStatement—— 它把所有含PreparedStatement的代码都扫一遍,而实际风险只在 SQL 模板动态生成时;保留SQL_Injection_Java_StringConcatenation就够了 -
SQL_Injection_NodeJS_Concat—— 对query + req.query.id类型报警合理,但对knex('users').where('id', id)这种链式调用也报,属于过度覆盖;应改用更精准的SQL_Injection_NodeJS_Raw
复杂点在于:同一个拼接行为,在 MyBatis 的 ${} 和 #{} 里语义完全不同,Checkmarx 不解析 XML/Annotation 上下文,只能靠你人工加过滤器或注释 // CxExclude 来压制误报 —— 这步跳过去,后面 review 效率会断崖下跌。











