公司要求修改bug,遇到大致两种sql注入的bug,一种是表名做变量名,一种是order by后面跟${},请问该如何去修改
搜一搜,参数化查询
使用参数的方式,那么不管对方往里面塞什么语句,它都被当做值而不是语法来执行
什么转义,什么过滤,都是不靠谱的方法
用#{}这种写法
接收到的参数不要直接往sql里扔,过滤一下sql注入高危字符再用更安全。
org.apache.commons.lang.StringEscapeUtils.escapeSql
过滤一下sql注入高危字符
提供参考思路,链接:https://www.cnblogs.com/hanease/p/15927006.html
【文章以实例形式讲解分析,并结合5种不同的方法思路去讲解】
最基本的 1. 不要直接用sql代码拼接,2. 执行的sql语句尽量参数化进行操作
防注入,可以使用#{}代替${}
order by ${sort} ${order} 改成 order by #{sort} #{order}
${prefix}pubrole_ apps
mysql的设计就是不支持将表名作为参数
两种思路:
1、动态表名的话,可以重写下拦截器,在拦截器中写代码,指定规则的才追加
2、写存储过程
动态表名的处理,做一个白名单过滤比较安全。