Fortify漏洞Access Control: Database(数据越权)
如果项目使用的是Mybatis,按照Fortify给出的修复方案,给SQL中添加类似USER这样的查询条件来控制权限,扫描结果中依旧无法去除此漏洞。
理解此漏洞要表述的含义,无论我们使用何种方式只要处理了并且测试通过就可以了。
吐槽一下: 代码检查工具是按照固定规则来检查的,规则是死的人是活的的,实现方式千变万化,岂是扫描工具就能涵盖的,然而有些客户强制要求漏洞扫描结果为0,这里真的很想骂人。
为了满足客户这些奇葩要求,现在给出下面几种解决方案:
- 方案一:使用mybatis-plus的QueryWrapper来解决问题
- 添加依赖mybatis-plus-boot-starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
- 编写代码
Service.java代码
// List<SystemActorRoleDto002> list = systemActorRole001Mapper.selectRoleModule(entity.getRoleId());
QueryWrapper<SystemActorRoleDto002> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("role_id", entity.getRoleId());
List<SystemActorRoleDto002> list = systemActorRole001Mapper.selectRoleModuleByWrapper(queryWrapper);
Mapper.java代码
// List<SystemActorRoleDto002> selectRoleModule(@Param("roleId") String roleId);
List<SystemActorRoleDto002> selectRoleModuleByWrapper(@Param("ew") QueryWrapper queryWrapper);
- 方案二:写一个基类,提供一些公共方法,在这些方法中调用SqlSession对应方法来操作数据库。
MybatisBaseDao
public interface MybatisBaseDao {
default <T> T findById(String statement, Object parameter) {
return SqlSessionUtils.getSqlSession(SpringContextUtil.getBean(SqlSessionFactory.class)).selectOne(statement, parameter);
}
default <T> List<T> findBatchById(String statement,