防XSS攻击

可以通过拦截器来对访问的地址设置HttpOnly属性来防止XSS攻击
具体实现如下:
1.在web.xml文件中配置拦截器,并对所有的访问进行拦截。
代码如下:


	XSS
	filter.XSSUriFilter


	XSS
	/*
	

2.书写拦截器对访问的进行处理。
代码如下:

public class XSSUriFilter implements Filter{

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest srq, ServletResponse srp,	FilterChain fc) throws IOException, ServletException {
		HttpServletRequest httpServletRequest = (HttpServletRequest) srq;
		HttpServletResponse httpServletResponse = (HttpServletResponse) srp;		
		//校验HOST信息,安全加固
		String myHost = httpServletRequest.getHeader("host");
		if (myHost == null || !(myHost.startsWith("134.64.") 
								|| myHost.startsWith("192.168")
								|| myHost.startsWith("127.0.0.1")
								|| myHost.startsWith("localhost"))) {
//			((HttpServletResponse)srp).sendRedirect("/SRMWeb/system/common/result/exception.jsp");
			srq.getRequestDispatcher("/system/common/result/exception.jsp").forward(srq, httpServletResponse);
			return;
		}
		//处理下Cookie上直接设置HttpOnly属性 
		Cookie[] cookies = httpServletRequest.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				StringBuilder builder = new StringBuilder();
				if ("JSESSIONID".equals(cookie.getName())) {
					builder.append(cookie.getName() + "=" + cookie.getValue() + "; ");
					builder.append("Secure; ");
					builder.append("HttpOnly; ");
					Calendar cal = Calendar.getInstance();
					cal.add(Calendar.HOUR, 6);
					Date date = cal.getTime();
					Locale locale = Locale.CHINA;
					SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss",
	                        locale);
	                builder.append("Expires=" + sdf.format(date));
					((HttpServletResponse)srp).setHeader("Set-Cookie", builder.toString());
				}
			}
		}
		//对URL中特殊的字符去掉,防止脚本注入
		String url = httpServletRequest.getRequestURI();	
		String regExp = "\\S+(script>|iframe>)\\S+";
		Pattern pattern = Pattern.compile(regExp);
		if (null != url && pattern.matcher(url).matches()) {
			((HttpServletResponse)srp).sendRedirect("/SRMWeb/system/common/result/exception.jsp");
		}else {
			fc.doFilter(srq, srp);
		}
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}
	
}

注:设置cookie为HttpOnly则可以防止脚本攻击,禁止了通过脚本获取cookie信息

设置原理:

1)第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有在首次访问服务器的时候才会在响应头中出现该信息)
防XSS攻击_第1张图片
上面的图JSESSIONID=ghco9xdnaco31gmafukxchph;Path=/acr,

浏览器会根据响应头的set-cookie信息设置浏览器的cookie并保存之

注意此cookie由于没有设置cookie有效日期,所以在关闭浏览器的情况下会丢失掉这个cookie。

2)当再次请求的时候(非首次请求),浏览器会在请求头里将cookie发送给服务器(每次请求都是这样)
防XSS攻击_第2张图片
(JSESSIONID=ghco9xdnaco31gmafukxchph)

不难发现这个的jsessionid和上面的jsessionid是一样的
3)为什么除了首次请求之外每次请求都会发送这个cookie呢(在这里确切地说是发送这个jsessionid)?

事实上当用户访问服务器的时候会为每一个用户开启一个session,浏览器是怎么判断这个session到底是属于哪个用户呢?jsessionid的作用就体现出来了:jsessionid就是用来判断当前用户对应于哪个session。换句话说服务器识别session的方法是通过jsessionid来告诉服务器该客户端的session在内存的什么地方。

事实上jsessionid ==request.getSession().getId()

4)总结,jsessionid的工作流程可以简单用下面的图表示:

防XSS攻击_第3张图片

你可能感兴趣的:(工作总结)