介绍
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 使用说明安全模块:ModSecurityOWASP CRS 规则集