1. 程式人生 > >Web應用內XSS攻擊防範 - ParameterValidationFilter

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檔案中已經配置的paramNamePatternStringrequestURIPatternStringrequestURIPatternNegatedEnforcingMode 引數外,規則FailIfNotCanonicalizedValidationRuleFailIfContainsHTMLValidationRule 中分別還預置了幾個引數(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 規則集