Web應用內XSS攻擊防範 - ParameterValidationFilter
介紹
web應用進行xss攻擊防範,常用到下面2類方法:
- 容器(Nginx/Apache)安裝WAF模組(ModSecurity)
- 應用配置引數檢查過濾器(ParameterValidationFilter)
一般來說,在容器上增加WAF模組,通用性更強,但在特殊場景下還是會用到在應用內部新增攔截器來實現xss防範。兩類實現核心的邏輯實現基本上都是OWASP組織提供了開源實現,本文主要介紹 ParameterValidationFilter 的基本用法和配置。
ParameterValidationFilter
maven型別專案在pom.xml中新增如下依賴,完成攔截器實現的引入,普通專案下載jar放入lib資料夾即可。
<dependency>
<groupId>com.matthewcasperson</groupId>
<artifactId>parameter_validation_filter</artifactId>
<version>1.2.1</version>
</dependency>
下一步在web.xml中新增過濾器配置,將該過濾器儘量配置在最前面,避免掉不必要的業務邏輯執行,引數檢查的規則配置主要還是在configFile
引數所指定的/WEB-INF/xml/pvf.xml
ParameterValidationFilter的攔截範圍可以根據自身應用的具體情況進行相對應的配置,下面的示例配置為攔截了應用中所有請求。
<!-- Security: Parameter Validation Filter --> <filter> <filter-name>ParameterValidationFilter</filter-name> <filter-class>com.matthewcasperson.validation.filter.ParameterValidationFilter</filter-class> <init-param> <param-name>configFile</param-name> <param-value>/WEB-INF/xml/pvf.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>ParameterValidationFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
pvf.xml
pvf.xml預設推薦的配置內容如下,主要配置了3個規則,順序執行。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ParameterValidationChainDatabase>
<EnforcingMode>true</EnforcingMode>
<ParameterValidationChains>
<ParameterValidationDefinition>
<ParameterValidationRuleList>
<ParameterValidationRule>
<validationRuleName>com.matthewcasperson.validation.ruleimpl.TrimTextValidationRule
</validationRuleName>
</ParameterValidationRule>
<ParameterValidationRule>
<validationRuleName>com.matthewcasperson.validation.ruleimpl.FailIfNotCanonicalizedValidationRule
</validationRuleName>
</ParameterValidationRule>
<ParameterValidationRule>
<validationRuleName>com.matthewcasperson.validation.ruleimpl.FailIfContainsHTMLValidationRule
</validationRuleName>
</ParameterValidationRule>
</ParameterValidationRuleList>
<paramNamePatternString>.*</paramNamePatternString>
<requestURIPatternString>.*</requestURIPatternString>
<paramNamePatternNegated>false</paramNamePatternNegated>
<requestURIPatternNegated>false</requestURIPatternNegated>
</ParameterValidationDefinition>
</ParameterValidationChains>
</ParameterValidationChainDatabase>
預設情況下,進行上述配置後即完成了應用內參數檢查過濾器的安裝配置工作,當請求中出現不合法的引數資訊時,攔截器將會直接返回400異常(Bad Request)至前端。
除去pvf.xml檔案中已經配置的paramNamePatternString
、requestURIPatternString
、requestURIPatternNegated
、EnforcingMode
引數外,規則FailIfNotCanonicalizedValidationRule
、FailIfContainsHTMLValidationRule
中分別還預置了幾個引數(settings Map中)可以進行自定義配置,該引數在官方文件中並沒有進行說明,需謹慎配置。
FailIfNotCanonicalizedValidationRule額外引數
allowBackSlash
:引數中是否允許出現反斜槓\\
FailIfContainsHTMLValidationRule額外引數
allowAmpersands
:引數中是否允許出現 &
allowAccents
:是否對引數進行規範化(歸一化)處理(Unicode規範化處理:規範化格式 D)
allowEllipsis
:引數中是否允許出現 ...
上述兩個規則的額外引數,預設都處於關閉false狀態,如果需要啟動設定,在pvf.xml對應規則(ParameterValidationRule)節點下進行對應的引數設定即可,配置方式參考如下:
<ParameterValidationRule>
<validationRuleName>com.matthewcasperson.validation.ruleimpl.FailIfContainsHTMLValidationRule
</validationRuleName>
<settings>
<entry>
<key>allowAmpersands</key>
<value>true</value>
</entry>
</settings>
</ParameterValidationRule>
參考
攔截器 ParameterValidationFilter 使用說明
安全模組:ModSecurity
OWASP CRS 規則集