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