1. 程式人生 > >數據庫連接池-配置 wallfilter

數據庫連接池-配置 wallfilter

user ica 行數 readonly prop variant ptc 防禦 表達

使用缺省配置的WallFilter

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

結合其他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這樣的語句
selectLimit -1 配置最大返回行數,如果select語句沒有指定最大返回行數,會自動修改selct添加返回限制

禁用對象檢測配置

配置項 缺省值 描述
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。

WallFilter配置說明

配置項 缺省值 描述
logViolation false 對被認為是攻擊的SQL進行LOG.error輸出
throwException true 對被認為是攻擊的SQL拋出SQLException
config
provider

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

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter#%E6%8C%87%E5%AE%9Adbtype


數據庫連接池-配置 wallfilter