Druid 配置 wallfilter

weixin_33901926發表於2017-03-01

這個文件提供基於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>

指定配置裝載的目錄

預設情況下,配置裝載的目錄如下:

資料庫型別目錄
mysql META-INF/druid/wall/mysql
oracle META-INF/druid/wall/oracle
sqlserver META-INF/druid/wall/sqlserver
postgres META-INF/druid/wall/postgres

從配置目錄中以下檔案中讀取配置:

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

指定配置裝載的目錄是可以指定,例如:

  <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 

攔截配置-語句

配置項預設值描述
selelctAllow true 是否允許執行SELECT語句
selectAllColumnAllow true 是否允許執行SELECT * FROM T這樣的語句。如果設定為false,不允許執行select * from t,但select * from (select id, name from t) a。這個選項是防禦程式通過呼叫select *獲得資料表的結構資訊。
selectIntoAllow true SELECT查詢中是否允許INTO字句
deleteAllow true 是否允許執行DELETE語句
updateAllow true 是否允許執行UPDATE語句
insertAllow true 是否允許執行INSERT語句
replaceAllow true 是否允許執行REPLACE語句
mergeAllow true 是否允許執行MERGE語句,這個只在Oracle中有用
callAllow true 是否允許通過jdbc的call語法呼叫儲存過程
setAllow true 是否允許使用SET語法
truncateAllow true truncate語句是危險,預設開啟,若需要自行關閉
createTableAllow true 是否允許建立表
alterTableAllow true 是否允許執行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,這就是一個只讀資料來源了。

攔截配置-永真條件

配置項 預設值 描述
selectWhereAlwayTrueCheck true 檢查SELECT語句的WHERE子句是否是一個永真條件
selectHavingAlwayTrueCheck true 檢查SELECT語句的HAVING子句是否是一個永真條件
deleteWhereAlwayTrueCheck true 檢查DELETE語句的WHERE子句是否是一個永真條件
deleteWhereNoneCheck false 檢查DELETE語句是否無where條件,這是有風險的,但不是SQL隱碼攻擊型別的風險
updateWhereAlayTrueCheck true 檢查UPDATE語句的WHERE子句是否是一個永真條件
updateWhereNoneCheck false 檢查UPDATE語句是否無where條件,這是有風險的,但不是SQL隱碼攻擊型別的風險
conditionAndAlwayTrueAllow false 檢查查詢條件(WHERE/HAVING子句)中是否包含AND永真條件
conditionAndAlwayFalseAllow false 檢查查詢條件(WHERE/HAVING子句)中是否包含AND永假條件
conditionLikeTrueAllow true 檢查查詢條件(WHERE/HAVING子句)中是否包含LIKE永真條件

其他攔截配置

配置項 預設值 描述
selectIntoOutfileAllow false SELECT ... INTO OUTFILE 是否允許,這個是mysql注入攻擊的常見手段,預設是禁止的
selectUnionCheck true 檢測SELECT UNION
selectMinusCheck true 檢測SELECT MINUS
selectExceptCheck true 檢測SELECT EXCEPT
selectIntersectCheck true 檢測SELECT INTERSECT
mustParameterized false 是否必須引數化,如果為True,則不允許類似WHERE ID = 1這種不引數化的SQL
strictSyntaxCheck true 是否進行嚴格的語法檢測,Druid SQL Parser在某些場景不能覆蓋所有的SQL語法,出現解析SQL出錯,可以臨時把這個選項設定為false,同時把SQL反饋給Druid的開發者。
conditionOpXorAllow false 查詢條件中是否允許有XOR條件。XOR不常用,很難判斷永真或者永假,預設不允許。
conditionOpBitwseAllow true 查詢條件中是否允許有"&"、"~"、"|"、"^"運算子。
conditionDoubleConstAllow false 查詢條件中是否允許連續兩個常量運算表示式
minusAllow true 是否允許SELECT * FROM A MINUS SELECT * FROM B這樣的語句
intersectAllow true 是否允許SELECT * FROM A INTERSECT SELECT * FROM B這樣的語句
constArithmeticAllow true 攔截常量運算的條件,比如說WHERE FID = 3 - 1,其中"3 - 1"是常量運算表示式。
limitZeroAllow false 是否允許limit 0這樣的語句

禁用物件檢測配置

配置項 預設值 描述
tableCheck true 檢測是否使用了禁用的表
schemaCheck true 檢測是否使用了禁用的Schema
functionCheck true 檢測是否使用了禁用的函式
objectCheck true 檢測是否使用了“禁用對物件”
variantCheck true 檢測是否使用了“禁用的變數”
readOnlyTables 指定的表只讀,不能夠在SELECT INTO、DELETE、UPDATE、INSERT、MERGE中作為"被修改表"出現<

Jdbc相關配置

配置項 預設值 描述
metadataAllow true 是否允許呼叫Connection.getMetadata方法,這個方法呼叫會暴露資料庫的表資訊
wrapAllow true 是否允許呼叫Connection/Statement/ResultSet的isWrapFor和unwrap方法,這兩個方法呼叫,使得有辦法拿到原生驅動的物件,繞過WallFilter的檢測直接執行SQL。

WallFiler配置說明

配置項 預設值 描述
logViolation false 對被認為是攻擊的SQL進行LOG.error輸出
throwException true 對被認為是攻擊的SQL丟擲SQLExcepton
config    
provider    

剛開始引入WallFilter的時候,把logViolation設定為true,而throwException設定為false。就可以觀察是否存在違規的情況,同時不影響業務執行。

 

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

相關文章