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