解决使用动态order by造成的SQL注入问题的简单方式

    SQL注入其实是个老生常谈的问题,自然也有很多解决方案。其实在使用JFinal的过程中,只要不使用拼接sql,严格使用enjoy sql模板的#para(...)方式进行参数传值,是不可能产生SQL注入问题。

    不过在之前的开发中,又遇到sql中需要动态指定排序条件的场景,即sql模板中的order by是需要根据前端的选择来动态生成,如下面动过点击不同排序方式来展示数据的场景。

图片5.png

而我们知道order by的部分是不可以使用#para(orderBy)传值,因为sql中的这个部分不支持使用占位符。所以只能使用#(orderBy)

图片1.png

 如果直接将前端的传值进行sql拼接,这样传值就实现了sql注入,可以直接获取对应select语句的数据:

图片7.png

    所以,要防止sql注入,即不能直接将前端的传值进行拼接,需要自行判断以后在后端代码生成orderBy最终的值。比如一个简单的例子:

修改前:

图片3.png

修改后:

图片4.png

定义一个包含前端指定排序条件的list,然后与前台传值进行对比是否包含即可。

修改之后的就可以保证最终的orderBy部分是一个合法的排序条件,这样就解决了问题。

就入波总说的:你的 SQL 永远是自己的代码生成的,用户提交的参数,不直接用, 只参与生成的逻辑,不参与拼接









评论区

chcode

2021-10-19 16:44

开启 druid sql 防火墙不就行了,哪里要这么麻烦

steven_lhcb_9527

2021-10-19 17:03

排序规则在后端规定就好了啊,为啥还要前端传

steven_lhcb_9527

2021-10-19 17:09

action调用这个queryLectureList的时候,在action配置自定义注解来设置排序,service里面直接取注解的值,没有的话就取你的默认值。

弯道加速跑

2021-10-20 11:14

@chcode 谢了,你说的这个其实我知道,不过我这里用的是jboot,项目的配置,包括数据库的配置都放在了nacos配置中心了,还不知道怎么把过滤器配置进去,研究下。。。

热门分享

扫码入社