淘先锋技术网

首页 1 2 3 4 5 6 7

XSS

跨站脚本攻击

向正常网站的表单中注入恶意脚本代码,窃取网站私有内容,比如窃取cookies、localstorage、sessionstorage的内容。

防御策略

设置cookies为HttpOnly 使cookie不可被js读取操作。

CSRF/XSRF

跨站请求伪造

诱导用户在恶意网站内点击链接,链接请求正常网站的功能业务,会自动携带正常网站的cookies,在用户不知情的情况下完成一些操作。

防御策略
  1. 健强服务端逻辑,严格restful风格,可以防御一些低端的攻击。
  2. 利用请求头中的refer内容,refer是浏览器在发起请求是设置的当前请求来源网站的信息,可以防御绝大部分的攻击。
  3. 每次请求需要用户填写验证码,可以防御所有攻击,当然这种方式体验太差。
  4. x-xsrf-token,在发起请求前由前端从cookie中读取一个随机token,这个token可能是之前种下的,写到header中,因为只有同一个域下的js才能访问cookie(未设置httponly的),可以防御所有攻击。

CORS

Cross-origin resource sharing 跨域资源共享
  1. 对于客户端,我们还是正常使用xhr对象发送ajax请求。
    唯一需要注意的是,我们需要设置我们的xhr属性withCredentials为true,不然的话,cookie是带不过去的哦,设置: xhr.withCredentials = true;
  2. 对于服务器端,需要在 response header中设置如下两个字段:
    Access-Control-Allow-Origin: [http://www.yourhost.com]
    Access-Control-Allow-Credentials:true
    这样,我们就可以跨域请求接口了。
public class CrossFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
		String origin = httpServletRequest.getHeader("origin");
		if (StringUtil.isNotBlank(origin)) {
			httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
			httpServletResponse.setHeader("Access-Control-Max-Age", "600");
			httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
			if (httpServletRequest.getMethod().equalsIgnoreCase("OPTIONS")) {
				httpServletResponse.setStatus(200);
				httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
				httpServletResponse.setHeader("Access-Control-Allow-Headers",
						"x-requested-with, accept, origin, content-type");
				httpServletResponse.setHeader("Content-Type", "application/json;charset=utf-8");
				return;
			}
		}
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {

	}
}
  1. jsonp访问跨域资源