SQL注入其实是个老生常谈的问题,自然也有很多解决方案。其实在使用JFinal的过程中,只要不使用拼接sql,严格使用enjoy sql模板的#para(...)方式进行参数传值,是不可能产生SQL注入问题。
不过在之前的开发中,又遇到sql中需要动态指定排序条件的场景,即sql模板中的order by是需要根据前端的选择来动态生成,如下面动过点击不同排序方式来展示数据的场景。
而我们知道order by的部分是不可以使用#para(orderBy)传值,因为sql中的这个部分不支持使用占位符。所以只能使用#(orderBy)
如果直接将前端的传值进行sql拼接,这样传值就实现了sql注入,可以直接获取对应select语句的数据:
所以,要防止sql注入,即不能直接将前端的传值进行拼接,需要自行判断以后在后端代码生成orderBy最终的值。比如一个简单的例子:
修改前:
修改后:
定义一个包含前端指定排序条件的list,然后与前台传值进行对比是否包含即可。
修改之后的就可以保证最终的orderBy部分是一个合法的排序条件,这样就解决了问题。
就入波总说的:你的 SQL 永远是自己的代码生成的,用户提交的参数,不直接用, 只参与生成的逻辑,不参与拼接