代码是别人写的,我只负责代码扫描漏洞修复
项目用的是myBatis-plus,部分业务无法使用框架提供的QueryWrapper来实现,因此在xml文件中手写的sql,
所以在代码扫描时报出Access Control: Database漏洞,
在网上找了一种方法是在mapper的namespace后面加后缀,项目运行时再去掉后缀来躲避扫描,
但是此方法导致QueryWrapper不能使用,调用接口时报错:无法找到selectList()方法(QueryWrapper提供的方法)
求解决方法,不修改原来业务逻辑(原业务逻辑不是我写的)并且代码修改量小(项目中此漏洞有800多个)
为了修复 Fortify 漏洞“Access Control: Database”,你可以考虑以下几种方法:
使用框架提供的查询条件工具类(如 mybatis-plus 的 QueryWrapper)来替代手写的 sql。这样可以保证在执行数据库查询时能够自动做到权限控制。
对手写的 sql 进行参数校验,确保在执行数据库查询时不会越过授权范围。可以使用常用的参数校验库(如 Apache Commons Validator)来实现。
在数据库中设置视图或存储过程来代替手写的 sql。这样可以在数据库层面对数据进行权限控制,避免漏洞的产生。
对于数据库访问漏洞,最好的解决方式是在代码层面进行修复。如果不能修改原来的业务逻辑,可以可以试试在原来的 SQL 语句上进行修改,使其能够防御 SQL 注入攻击。
具体来说,可以可以试试使用 PreparedStatement 来构建 SQL 语句,而不是直接拼接字符串。Prepared Statement 是一种特殊的 SQL 语句,它可以预先将参数绑定到 SQL 语句中,在执行时使用参数值替换占位符,这样就可以避免 SQL 注入了。
在 MyBatis 中,可以使用 #{parameter} 来表示占位符,并使用 @Param 注解将参数绑定到占位符上。
例如原来的 SQL 语句可能是这样的:
SELECT * FROM users WHERE username = '${username}' AND password = '${password}'
可以将其改写成如下形式:
SELECT * FROM users WHERE username = #{username} AND password = #{password}
并在调用时使用 @Param 注解绑定参数:
@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
User getUser(@Param("username") String username, @Param("password") String password);
这样就可以使用 Prepared Statement 的方式来避免 SQL 注入风险了。
当然,如果希望使用 QueryWrapper,还可以使用 MyBatis Plus 提供的其他功能,比如 Lambda 表达式来构建 SQL 语句。
望采纳。
在扫描漏洞时遇到 "Access Control: Database" 漏洞可能意味着代码中存在某些 SQL 注入攻击的风险。这种风险通常是由于代码使用了未过滤的用户输入来构建 SQL 查询时产生的。
解决此问题的一种方法是使用预处理语句或参数化查询来构建 SQL 查询,从而避免未过滤的用户输入被用作 SQL 代码的一部分。您可以使用 myBatis-plus 提供的 QueryWrapper 类
提供参考实例【Fortify屏蔽漏洞Access Control: Database】,链接:https://blog.csdn.net/weixin_43063748/article/details/125435067