數據庫連接池-配置 wallfilter
阿新 • • 發佈:2018-11-19
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