最近项目在做安全扫描,扫出来“跨域
脚本攻击”的
安全漏洞,修复这个漏洞的时候
发现了一个问题:
当FORM 表单中设置encType="multipart/form-data",filter中将拦截不到此表单数据,查看了一些源码发现此数据都是封装到multipartServeletRequest中的,但是能拿到这些数据,但是过滤之后,这些数据无法放回去。
导致此问题无法解决,问过公司
架构师,貌似
他们也没有好的方法。只能建议,有上传功能时,单独上传,跟数据上传分开做。
对于普通的form表单,修复此漏洞,只需将request.getParameterMap()中的数据迭代替换。
由于项目保密问题,以下是关键代码:
class="java">
public class aaa implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {
setReplaceStr(filterConfig.getInitParameter("replaceStr"));//replaceStr变量 get和set方法
setExcludeParamName(filterConfig
.getInitParameter("excludeParamName"));//excludeParamName变量 get和set方法
cleanParameters(request.getParameterMap());
filterChain.doFilter(req, response);
}
private void cleanParameters(Map original) {
for (Object key : original.keySet()) {
Object value = original.get(key);
if (value instanceof String[]) {
// 不需要过滤的参数名
if (getExcludeParamNames() != null
&& getExcludeParamNames().contains(key)) {
parameterMap.put(key, (String[]) value);
} else {
parameterMap.put(key, clean((String[]) value));
}
} else {
parameterMap.put(key, value);
}
}
}
private String[] clean(String[] values) {
List<SensitiveKeyFilterKey> keys = null;
String[] clean = new String[values.length];
for (int i = 0; i < clean.length; i++) {
// 清理xss攻击
clean[i] = Jsoup.clean(values[i], TagWhitelist.defaultWhitelist());
}
return clean;
}
}
其中Jsoup是一个开源的jar包,网上可以搜索到,在此不上传了。