1. 程式人生 > >資料庫連線池druid wallfilter配置

資料庫連線池druid wallfilter配置

使用預設配置的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>

    為了簡化通過連線池獲取資料庫連線的過程,JDBC2.0規範中引進了JDBC資料來源(DataSource)的概念。DataSource物件是Connection物件的工廠,也可以認為是資料

指定配置裝載的目錄

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

資料庫型別  目錄 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.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

攔截配置-語句

配置項 預設值 描述 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。就可以觀察是否存在違規的情況,同時不影響業務執行。