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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一种实时数据分析工具,而达梦是一种关系型数据库。Druid Wallfilter是一种用于连接Druid和达梦数据库的插件。 Druid Wallfilter插件的作用是在Druid查询中进行SQL墙过滤,它允许Druid直接连接到达梦数据库,从而可以在Druid中对达梦数据库中的数据进行实时分析和查询。使用Druid Wallfilter可以实现将达梦数据库中的数据导入到Druid中,以便进行更复杂和高效的数据处理和分析。 Druid Wallfilter连接到达梦数据库的过程相对简单。首先,需要在Druid的配置文件中添加达梦数据库的连接信息,包括数据库的地址、用户名、密码等。然后,在Druid的查询语句中使用特定的语法来指定连接到达梦数据库,并执行相应的SQL查询操作。Druid Wallfilter会自动将查询转换为达梦数据库可以理解的SQL语句,并将结果返回给Druid进行进一步处理和分析。 通过使用Druid Wallfilter连接达梦数据库,可以充分利用Druid的实时数据处理和分析能力,同时也可以充分发挥达梦数据库的数据存储和管理功能。这样,用户可以在Druid中进行复杂的数据查询和分析操作,同时又能够充分利用达梦数据库所提供的功能和特性,从而提升数据处理的性能和效率。 总而言之,Druid Wallfilter插件可以实现Druid与达梦数据库的连接,使得在Druid中对达梦数据库的数据进行实时查询和分析成为可能。通过合理配置和使用Druid Wallfilter,可以使得数据处理和分析过程更加高效和便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值