解决自定义排序防止sql注入

1、场景 :
页面列表需要按照指定列排序,前端向服务端传入排序参数,Sorted对象包含排序字段prop和排序方式order。例如要按照id倒序排序。前端传参{prop:"id",order:"desc"} ,后端接收后生产sql语句: select * from table1 order by id desc 看似没有问题,假如该接口被恶意攻击者知道,传入参数{prop:"id",order:";delete from table1"},后端接收后生产sql语句: select * from table1 order by id ;delete from table1 ,结果就是导致表数据被删。
2、解决方法:
Sorted对象中的order参数防sql注入相对比较简单。前后端约定一个枚举,前端传枚举code,后端转化为msg便可以解决。比如枚举1对应asc,2对应desc,前端只需要传1或2,后端按照枚举转化就可以避免sql注入。那么身为变量的prop该如何防止sql注入呢?因为是变量,枚举当然行不通。下面我来说说我的解决方法(结合实际业务)。
大致思路是这样的:后端接收到排序参数时去判断prop变量值是否包含在列表属性内,若包含在内,转化为排序语句,若非包含在内,转为空排序或默认排序语句。
这个逻辑放在baseParam<T>类型去处理,继承他的子类把列表属性类以泛型传入进来,再做反射获取属性列表,再做上述业务处理。
做反射关键要拿到子类的class,这里即要拿到泛型T的class.这里要用到java中的Type类型

Type genType = getClass().getGenericSuperclass();  
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();  
Class<T> tClass = (Class<T>) params[0];  

当然,如果你是刚好列表属性类继承了baseParam,获取子类class就比较简单了,父类this.class就在子类实例化的时候获取到子类class。

注:如果有更好的办法,后期将会更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值