避免使用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. 欢迎补充...

 */