为了应对 Xss 跨站脚本攻击,新增 XssFilter 统一处理实践

问题背景:

1、早期的软件产品,使用 spring mvc 

2、jsp form 表单中要传附件,同时有 input 字段要提交,因此表单 encType 必须是 multipart/form-data, action="POST"

问题:

1、按照流转很广的方式 ,新建 XssFilterServletRequestWrapper extends HttpServletRequestWrapper, XssFilter 中 dofilter 方法中  HttpServletRequest req = (HttpServletRequest) request; 对  ServletRequest 参数进行强制类型转换,然后 

XssFilterServletRequestWrapper wrapper = new XssFilterServletRequestWrapper(req);
chain.doFilter(wrapper, response);

结果, XssFilterServletRequestWrapper 中的  getParameter  getParameterValues 方法中取不到表单中的 参数值

原因: multipart/form-data 提交到 servlet 的数据格式不是 key/value 格式,是流的格式,所以 getParameter  取不到值

解决: 

1、可以用smartupload 解析 form 提交的流数据

2、高级一点的,用 spring 造好的轮子 MultipartHttpServletRequest 接口来处理,MultipartHttpServletRequest 继续了  javax.servlet.http.HttpServletRequest 接口 和 org.springframework.web.multipart.MultipartRequest 接口,关键代码如下:

 HttpServletRequest req = (HttpServletRequest) request;

MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(req);

XssFilterServletRequestWrapper wrapper = new XssFilterServletRequestWrapper(multiReq);

chain.doFilter(wrapper, response);

你可能感兴趣的:(java,OA,应用软件)