Checkmarx报JpaRepository调用SQL注入是否为误报及修复方案
漏洞判定
该检出大概率为Checkmarx静态扫描的误报。
你当前使用的是Spring Data JPA内置的findById、save接口,底层Hibernate等ORM框架会默认使用预编译参数化语句执行数据库操作,不存在手动拼接SQL的逻辑,正常情况下不会产生SQL注入风险。
误报触发原因是Checkmarx的规则匹配逻辑仅识别到外部传入的不可信参数roleId、userId未经过校验就直接流入持久化层方法,触发了通用的不可信参数流入数据库操作的告警规则,并非真的检测到SQL注入的拼接逻辑。
可行修复方案
- 添加入参合法性校验
针对外部传入的userId、roleId增加格式校验,比如如果是数值型ID,限制入参只能为数字;如果是UUID格式ID,用正则限制输入必须符合UUID规则,既可以拦截恶意输入,也能满足静态扫描的校验要求。示例如下:public String assignRole(@Pattern(regexp = "^\\d+$", message = "用户ID格式非法") String userId, @Pattern(regexp = "^\\d+$", message = "角色ID格式非法") String roleId) { // 原有业务逻辑保持不变 } - 排查自定义ORM查询逻辑
检查roleRepository、userRepository中是否存在自定义的@Query原生SQL查询,确认所有自定义SQL均使用参数绑定而非字符串拼接的方式传入入参,避免遗漏真实的注入风险。 - 白名单标记误报
确认所有逻辑无风险后,可以通过@SuppressWarnings("checkmarx:SQLInjection")注解标记该方法忽略对应扫描规则,或者在Checkmarx扫描平台上将该条告警标记为误报处理。
内容的提问来源于stack exchange,提问作者Andres Aldana
相关产品推荐
相关产品推荐

