Druid 的 WallFilter 拋出 sql injection violation, comment not allow 問題的解決方法

ps:

    https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter可以對應修改參數。

    如需要執行多行語句 , 要設置multiStatementAllow爲true

1 現象

查詢某個模塊數據時,拋出以下異常:

Caused by: java.sql.SQLException: sql injection violation, comment not allow : select count(*) FROM sys_x a WHERE 1=1 --澶囨敞 AND a.organization_id NOT IN( SELECT b.descendant_id FROM sys_y b WHERE b.path_length!=0) 
	at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:800)
	at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:251)
	at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:473)
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342)
	at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:349)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:239)
	at com.sun.proxy.$Proxy23.prepareStatement(Unknown Source)
	at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:245)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:583)
	... 59 more
複製代碼

2 原因

  1. 在數據源配置時,加上了 Druid 的 wall 過濾器。而它默認的攔截策略是,不允許 SQL 中帶有備註。
  2. 在該條 SQL 語句中,果然加了備註。

3 解決

  1. 如果是新項目,SQL 語句較少,那麼可以去除語句中的備註。
  2. 如果是老項目,那麼就必須對 Druid 的 wall 過濾器進行配置,打開項目的 XML 配置文件,配置 druid 攔截過濾器,允許 SQL 語句中存在註釋:
<!--配置 druid 攔截過濾器-->
<bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig" init-method="init">
	<!-- 是否允許語句中存在註釋-->
	<property name="commentAllow" value="true" />
</bean>
<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
	<property name="config" ref="wall-filter-config" />
</bean>
複製代碼

然後在 Druid 數據源配置中,加入 Druid 攔截過濾器:

<!--druid 數據源-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
	...
	<!--配置 Druid 過濾器-->
	<property name="proxyFilters">
		<list>
		        ...
			<ref bean="wall-filter"/>
		</list>
	</property>
        ...
</bean>
複製代碼

重啓應用,看看問題是不是已經解決啦O(∩_∩)O哈哈~


作者:deniro
鏈接:https://juejin.im/post/5d340af7e51d455d850d3baf
來源:掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發佈了118 篇原創文章 · 獲贊 47 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章