XSS
跨站脚本攻击
向正常网站的表单中注入恶意脚本代码,窃取网站私有内容,比如窃取cookies、localstorage、sessionstorage的内容。
防御策略
设置cookies为HttpOnly 使cookie不可被js读取操作。
CSRF/XSRF
跨站请求伪造
诱导用户在恶意网站内点击链接,链接请求正常网站的功能业务,会自动携带正常网站的cookies,在用户不知情的情况下完成一些操作。
防御策略
- 健强服务端逻辑,严格restful风格,可以防御一些低端的攻击。
- 利用请求头中的refer内容,refer是浏览器在发起请求是设置的当前请求来源网站的信息,可以防御绝大部分的攻击。
- 每次请求需要用户填写验证码,可以防御所有攻击,当然这种方式体验太差。
- x-xsrf-token,在发起请求前由前端从cookie中读取一个随机token,这个token可能是之前种下的,写到header中,因为只有同一个域下的js才能访问cookie(未设置httponly的),可以防御所有攻击。
CORS
Cross-origin resource sharing 跨域资源共享
- 对于客户端,我们还是正常使用xhr对象发送ajax请求。
唯一需要注意的是,我们需要设置我们的xhr属性withCredentials为true,不然的话,cookie是带不过去的哦,设置:xhr.withCredentials = true
; - 对于服务器端,需要在 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() {
}
}
- jsonp访问跨域资源