数据库连接池druid wallfilter配置

这个文档提供基于Spring的各种配置方式

 

使用缺省配置的WallFilter

 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="filters" value="wall"/>
  </bean>

 

 

结合其他Filter一起使用

WallFilter可以结合其他Filter一起使用,例如:

 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="filters" value="wall,stat"/>
  </bean>

 

 

这样,拦截检测的时间不在StatFilter统计的SQL执行时间内。

如果希望StatFilter统计的SQL执行时间内,则使用如下配置

 

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="filters" value="stat,wall"/>
  </bean>

 

 

指定dbType

有时候,一些应用框架做了自己的JDBC Proxy Driver,是的DruidDataSource无法正确识别数据库的类型,则需要特别指定,如下:

 

<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
      <property name="dbType" value="mysql" />
  </bean>

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="proxyFilters">
          <list>
              <ref bean="wall-filter"/>
          </list>
      </property>
  </bean>

 

 

指定配置装载的目录

缺省情况下,配置装载的目录如下:

数据库类型 目录
mysqlMETA-INF/druid/wall/mysql
oracleMETA-INF/druid/wall/oracle
sqlserverMETA-INF/druid/wall/sqlserver
postgresMETA-INF/druid/wall/postgres

 

从配置目录中以下文件中读取配置:

 

 deny-variant.txt
  deny-schema.txt
  deny-function.txt
  deny-table.txt
  deny-object.tx

指定配置装载的目录是可以指定,例如:

 

<bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig" init-method="init">
      <!-- 指定配置装载的目录  -->
      <property name="dir" value="META-INF/druid/wall/mysql" />
  </bean>

  <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
      <property name="dbType" value="mysql" />
      <property name="config" ref="wall-filter-config" />
  </bean>

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="proxyFilters">
          <list>
              <ref bean="wall-filter"/>
          </list>
      </property>
  </bean>

 

 

WallConfig详细说明

配置项缺省值
dir按照dbType分别配置:
mysql : META-INF/druid/wall/mysql
oracle : META-INF/druid/wall/oracle
sqlserver : META-INF/druid/wall/sqlserver

拦截配置-语句

配置项缺省值描述
selelctAllowtrue是否允许执行SELECT语句
selectAllColumnAllowtrue是否允许执行SELECT * FROM T这样的语句。如果设置为false,不允许执行select * from t,但select * from (select id, name from t) a。这个选项是防御程序通过调用select *获得数据表的结构信息。
selectIntoAllowtrueSELECT查询中是否允许INTO字句
deleteAllowtrue是否允许执行DELETE语句
updateAllowtrue是否允许执行UPDATE语句
insertAllowtrue是否允许执行INSERT语句
replaceAllowtrue是否允许执行REPLACE语句
mergeAllowtrue是否允许执行MERGE语句,这个只在Oracle中有用
callAllowtrue是否允许通过jdbc的call语法调用存储过程
setAllowtrue是否允许使用SET语法
truncateAllowtruetruncate语句是危险,缺省打开,若需要自行关闭
createTableAllowtrue是否允许创建表
alterTableAllowtrue是否允许执行Alter Table语句
dropTableAllow true是否允许修改表
commentAllow false是否允许语句中存在注释,Oracle的用户不用担心,Wall能够识别hints和注释的区别
noneBaseStatementAllow false是否允许非以上基本语句的其他语句,缺省关闭,通过这个选项就能够屏蔽DDL。
 multiStatementAllow false 是否允许一次执行多条语句,缺省关闭
 useAllow true 是否允许执行mysql的use语句,缺省打开
 describeAllow true 是否允许执行mysql的describe语句,缺省打开
 showAllow true 是否允许执行mysql的show语句,缺省打开
 commitAllow true

 是否允许执行commit操作

rollbackAllow true

 是否允许执行roll back操作

如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都设置为false,这就是一个只读数据源了。

 

拦截配置-永真条件

配置项缺省值缺省值
selectWhereAlwayTrueChecktrue检查SELECT语句的WHERE子句是否是一个永真条件
selectHavingAlwayTrueChecktrue检查SELECT语句的HAVING子句是否是一个永真条件
deleteWhereAlwayTrueChecktrue检查DELETE语句的WHERE子句是否是一个永真条件
deleteWhereNoneCheckfalse检查DELETE语句是否无where条件,这是有风险的,但不是SQL注入类型的风险
updateWhereAlayTrueChecktrue 检查UPDATE语句的WHERE子句是否是一个永真条件
 updateWhereNoneCheck false 检查UPDATE语句是否无where条件,这是有风险的,但不是SQL注入类型的风险
 conditionAndAlwayTrueAllow false检查查询条件(WHERE/HAVING子句)中是否包含AND永真条件
 conditionAndAlwayFalseAllow false 检查查询条件(WHERE/HAVING子句)中是否包含AND永假条件
 conditionLikeTrueAllowtrue 检查查询条件(WHERE/HAVING子句)中是否包含LIKE永真条件

 

其他拦截配置

配置项缺省值描述
selectIntoOutfileAllowfalseSELECT ... INTO OUTFILE 是否允许,这个是mysql注入攻击的常见手段,缺省是禁止的
selectUnionChecktrue检测SELECT UNION
selectMinusChecktrue检测SELECT MINUS
selectExceptChecktrue检测SELECT EXCEPT
selectIntersectChecktrue检测SELECT INTERSECT
mustParameterizedfalse是否必须参数化,如果为True,则不允许类似WHERE ID = 1这种不参数化的SQL
strictSyntaxChecktrue是否进行严格的语法检测,Druid SQL Parser在某些场景不能覆盖所有的SQL语法,出现解析SQL出错,可以临时把这个选项设置为false,同时把SQL反馈给Druid的开发者。
conditionOpXorAllowfalse查询条件中是否允许有XOR条件。XOR不常用,很难判断永真或者永假,缺省不允许。
conditionOpBitwseAllowtrue查询条件中是否允许有"&"、"~"、"|"、"^"运算符。
conditionDoubleConstAllowfalse查询条件中是否允许连续两个常量运算表达式
minusAllowtrue是否允许SELECT * FROM A MINUS SELECT * FROM B这样的语句
intersectAllowtrue是否允许SELECT * FROM A INTERSECT SELECT * FROM B这样的语句
constArithmeticAllowtrue拦截常量运算的条件,比如说WHERE FID = 3 - 1,其中"3 - 1"是常量运算表达式。
limitZeroAllowfalse是否允许limit 0这样的语句

 

禁用对象检测配置

配置项缺省值描述
tableChecktrue检测是否使用了禁用的表
schemaChecktrue检测是否使用了禁用的Schema
functionChecktrue检测是否使用了禁用的函数
objectChecktrue检测是否使用了“禁用对对象”
variantChecktrue检测是否使用了“禁用的变量”
readOnlyTables指定的表只读,不能够在SELECT INTO、DELETE、UPDATE、INSERT、MERGE中作为"被修改表"出现

 

Jdbc相关配置

配置项缺省值描述
metadataAllowtrue是否允许调用Connection.getMetadata方法,这个方法调用会暴露数据库的表信息
wrapAllowtrue是否允许调用Connection/Statement/ResultSet的isWrapFor和unwrap方法,这两个方法调用,使得有办法拿到原生驱动的对象,绕过WallFilter的检测直接执行SQL。

WallFiler配置说明

配置项缺省值描述
logViolationfalse对被认为是攻击的SQL进行LOG.error输出
throwExceptiontrue对被认为是攻击的SQL抛出SQLExcepton
config  
provider  

 

刚开始引入WallFilter的时候,把logViolation设置为true,而throwException设置为false。就可以观察是否存在违规的情况,同时不影响业务运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值