记一次JAVA WEB项目解决XSS攻击的办法(亲测有效)
Posted on 2019-03-01 13:22 zkongbai 阅读(4381) 评论(4) 编辑 收藏
- 什么是XSS攻击
简单来说,XSS 攻击是页面被注入了恶意的代码,度娘一大堆的东西,不想说
- 系统架构主要是SSM框架,服务层另外使用了DubboX.
为啥说这个,因为SpringMVC对于Xss攻击需要特殊处理
- 思路
其实XSS工具解决思路就是捕获客户端提交的参数进行捕获,然后对参数值进行过滤处理,去除那些非法的字符.
但是请求通常分为GET请求与POST请求,针对不同的请求,处理方式是不一样的
- 步骤:
1.针对GET与非文件格式上传的post请求.(form 表单提交的时候 没有这个参数enctype="multipart/form-data"),JSON请求等
1) web.xml配置过滤器
View Code
2)过滤器实现 XssFilter.java,针对部分特殊请求,要求不走过滤的,可以在此过滤器中放行
View Code
3) XssHttpServletRequestWrapper
View Code
4) 使用到的编码工具,过滤参数使用了xss-html-filter工具,具体可以自行替换
View Code
5) pom.xml 配置引用的jar
1 <dependency> 2 <groupId>net.sf.xss-html-filter</groupId> 3 <artifactId>xss-html-filter</artifactId> 4 <version>1.5</version> 5 </dependency>
2.针对enctype="multipart/form-data"格式的post提交
1) 更改springMVC默认Annotation适配器(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter - -> cn.ffcs.web.filter.XssAnnotationMethodHandlerAdapter),如果没有则添加
1 <!-- annotation方法修饰器 --> 2 <bean id="handlerAdapter" class="cn.ffcs.web.filter.XssAnnotationMethodHandlerAdapter"> 3 4 .... 5 6 <bean>
2) 继承AnnotationMethodHandlerAdapter 并覆盖handle方法
1 package cn.ffcs.web.filter; 2 3 import java.util.Map; 4 import java.util.Set; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import net.sf.xsshtmlfilter.HTMLFilter; 10 11 import org.apache.commons.lang.StringUtils; 12 import org.springframework.web.servlet.ModelAndView; 13 import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; 14 @SuppressWarnings("deprecation") 15 public class XssAnnotationMethodHandlerAdapter extends 16 AnnotationMethodHandlerAdapter { 17 18 19 @SuppressWarnings({ "rawtypes", "unchecked" }) 20 private void myXss(HttpServletRequest request){ 21 Map map = request.getParameterMap(); 22 Set<String> keySet = map.keySet(); 23 for(String key : keySet){ 24 String[] values = request.getParameterValues(key); 25 if(values!=null&&values.length>0){ 26 for(int i=0 ;i<values.length;i++){ 27 if(!StringUtils.isBlank(values[i])){ 28 values[i] = XssEncode.xssEncode(values[i]); 29 } 30 } 31 } 32 } 33 } 34 35 @Override 36 public ModelAndView handle(HttpServletRequest request, 37 HttpServletResponse response, Object handler) throws Exception { 38 myXss(request); 39 return super.handle(request, response, handler); 40 } 41 }
tip: 网上另外有说用反射实现带@Controller的控制器,感觉思路可以,但是没有成功.
谁能知道自己的错失呢?愿你赦免我隐而未现的过错.求你阻扰仆人不犯任意妄为的罪,不容这罪辖制我,我便完全,免犯大罪.--诗19:12-13
分类: java