最近使用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被攔截再更新上來
個人觀點,