druid sql黑名单 报异常 sql injection violation, part alway true condition not allow

最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助,

但是最近发现里面 有条sql语句 被拦截了,在sql黑名单里,程序抛出异常

sql injection violation, part alway true condition not allow

sql 语句大概如下 HIbernate 组合出来的sql

SELECT this_.id AS id34_0_, this_.accountno AS accountno34_0_, this_.amount AS amount34_0_, this_.bankcard AS bankcard34_0_, this_.bankname AS bankname34_0_
FROM lhu.bankinfo this_
WHERE this_.type=? AND this_.isshow=? AND this_.useable=? AND this_.bankname=? AND this_.userrole LIKE ? AND 1=1 ORDER BY RAND()

百度查了一下,大概解决方法就是在配置文件中

将属性<property name="filters" value="config,stat,wall,log4j" />改成<property name="filters" value="config,stat,log4j" />

去掉 wall, 官方解析(监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall) , 这样问题确实解决,放druid不去过滤扫描这些语句。

那之前那个sql语句涉及sql注入问题,又对sql注入进一步了解了一下:

最后发现, ORDER BY RAND(),这句有很大的问题, ORDER BY RAND() 随机抽取的意思, 数据在执行会多次扫描表数据,这在数据量小的时候是可以做到随机抽取,

从来满足业务需要,但是数据量大的时候,反而会影响查询的效率,而且查询时间也比较长,sql语句中rand() 做随机数,也被列为禁区,

可能也是这个原因,druid认为这个语句是一个不安全的语句,从而过滤掉,类似的语句还有想sys_guid() 等都会去扫描整个表数据, 也会被拦截,

后续再出现sql被拦截再更新上来

个人观点,

上一篇:DataRead 和DataSet区别


下一篇:OGG for DB2 i 12.2发布