我在我的代码上运行Checkmarx并获得一个sql注入漏洞。这是im使用的简化方法
public String assignRole(String userId, String roleId) {
Optional<RoleEntity> roleEntity = roleRepository.findById(roleId)
if (roleEntity.isPresent()) {
UserEntity user = UserEntity.builder().userId(userId).role(roleEntity.get()).build();
userRepository.save(user);
return "SUCCESS";
} else {
throw new ServiceException("ERROR");
}}对检查单的分析表明:
应用程序的assignRole方法在src/Service.java的第xx行使用保存执行一个SQL查询。应用程序通过将不受信任的字符串嵌入到查询中而不进行适当的清理来构造此SQL查询。连接字符串被提交到数据库,并在数据库中进行相应的分析和执行。攻击者可以通过精心设计恶意有效负载并通过输入roleId提供恶意有效载荷,从而将任意语法和数据注入到SQL查询中;这可能会启用SQL注入攻击。
我有点困惑,因为我没有在查询中构建原生查询或连接字符串,或者我可能遗漏了什么。
有什么解决办法吗?或者可能是假阳性。
发布于 2022-05-03 05:39:18
这听起来像是假阳性。
如果您的Java代码使用Spring,我建议将扫描(设置>扫描设置>预设管理器)配置为禁用(未选中)的SQL_Injection和SQL_Injection项,以避免这些项出现错误。
如果您的代码仅通过Spring操作将数据保存到数据库,那么它就不会面临SQL注入攻击的风险。这是因为Spring使用映射到db的对象( ORM方法)将(插入或更新)保存到数据库,该对象不允许恶意地强制使用额外的sql。
尽管如此,据我所见,Checkmarx错误地将Spring标记为高度严重的SQL注入漏洞(SQL_Injection和/或Second_Order_SQL_Injection).有鉴于此,禁用这些规则在我看来是有效的,实际上也是解决这一问题的唯一可行方法。
但是,如果您确实采用了这种方法,请确保您的代码不会因为某种原因也使用其他一些其他的sql方法,例如包含通过使用PreparedStatement而未被净化的SQL的字符串。这些语句容易受到sql注入攻击的影响,我相信Checkmarx注入规则就是要识别的。
https://stackoverflow.com/questions/69980310
复制相似问题