避免使用mybatisplus排序传入排序字段引发安全漏洞
/** case study **/
/** 避免使用mybatisplus排序传入排序字段引发安全漏洞 **/
/**
* 问题代码
*
* 代码中orderByBO.getField()直接由前端传入数据库字段进行排序,存在sql注入风险,
* 比如field传入"1/(ascii(substr(user,9,1))-97)" 可以通过报错信息获取数据库链接的用户名
*/
if (OrderByEnum.DESC.getSort().equalsIgnoreCase(orderByBO.getSort())) {
qw.orderByDesc(orderByBO.getField());
} else {
qw.orderByAsc(orderByBO.getField());
}
/**
* 漏洞修复
*
* 将所有的合法排序字段做过滤,防止非法排序字段传入
*/
if (StringUtils.isBlank(orderByBO.getField())
|| (!StringUtils.equalsIgnoreCase(orderByBO.getField(), "sales_volume")
&& !StringUtils.equalsIgnoreCase(orderByBO.getField(), "score"))) {
throw new BusinessException("非法访问!");
}
....
/**
* 大家在以后开发类似功能时,要注意避免出现类似编码问题.
* 后端这样写虽然方便了代码实现(前端传字段即可实现不同字段排序,
* 后续新增排序,前端传不同字段就行,后端不需要做任何调整),
* 但是这样存在很大的安全漏洞.
* 提供以下几种实现思路:
* 1. 类似上边代码,但是字段要做过滤
* 2. 定义排序状态码,按不同的码值对应后端不同排序
* 3. 欢迎补充...
*/