跨域问题
只要协议、域名、端口有任何一个不同,都被当作是不同的域。
为什么会有跨域的限制?
之前发生过的一些跨域安全事件:
新浪微博XSS受攻击事件
2011年6月28日晚,新浪微博出现了一次比较大的XSS攻击事件。大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等微博和私信,并自动关注一位名为hellosamy的用户。
事件的经过线索如下:
20:14,开始有大量带V的认证用户中招转发蠕虫
20:30,某网站中的病毒页面无法访问
20:32,新浪微博中hellosamy用户无法访问
21:02,新浪漏洞修补完毕
http://coolshell.cn/articles/4914.html
百度贴吧xss攻击事件
2014年3月9晚,六安吧等几十个贴吧出现点击推广贴会自动转发等。
并且受到xss攻击的转帖吧友所关注的每个关注的贴吧都会转一遍,病毒循环发帖。并且导致吧务人员,和吧友被封禁。
CORS 协议
CORS 协议是W3C的标准协议(https://www.w3.org/TR/cors/ ),
CORS(Cross-Origin Resource Sharing)跨域资源共享,这个协议 定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
CORS 浏览器的支持情况
各种浏览器对 CORS 的支持情况如下图。(图来自: http://caniuse.com/#search=CORS)
- IE11 does not appear to support CORS for images in the canvas element
- Android and some old versions of WebKit (that may be found in various webview implementations) do not support Access-Control-Expose-Headers: https://code.google.com/p/android/issues/detail?id=56726
- IE10+ does not make a CORS request if port is the only difference (IE Bug #781303)
- IE10+ does not send cookies when withCredential=true (IE Bug #759587). A workaround is to use a P3P policy
CORS 的工作流
图来自: http://www.html5rocks.com/en/tutorials/cors/
如果浏览器 自身提供对CROS的支持,由它发送的请求会携带一个名为“Origin”的报头表明请求页面所在的站点。
资源获取请求被提供者接收之后,它可以根据该报头确定提供的资源需要共享给谁。资源提供者的授权通过一个名为“Access-Control-Allow-Origin”的响应报头来承载,其报头值表示得到授权的站点。一般来说,如果资源的提供者认可了当前请求的“Origin”报头携带的站点,那么它会将该站点作为“Access-Control-Allow-Origin”响应报头的值。除了指定具体的源并对其作针对性授权之外,资源提供者还可以将“Access-Control-Allow-Origin”报头值设置为“*”对所有消费者授权。
当浏览器接收到包含资源的响应之后,会提取此“Access-Control-Allow-Origin”响应报头的值。如果此值为“*”或者包含的源列表包含此前请求的源(即请求的“Origin”报头值),意味着资源的消费者获取了提供者获取和操作资源的权限,所以浏览器会允许JavaScript程序操作获取的资源。如果此响应报头不存在或者其值为“null”,客户端JavaScript程序针对资源的操作会被拒绝。
服务器端支持 CORS 的 流程图
图来自: http://www.html5rocks.com/en/tutorials/cors/
tomcat 添加CROS跨源请求 请参考 http://blog.csdn.net/liuwei063608/article/details/47273971
我们之前在玩 jsonp 的时候, 也会遇到跨域的问题, 它跟 cors 的对比如下:
CORS与JSONP相比,无疑更新,考虑支持的更全。
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。
参考资料:
Cross-Origin Resource Sharing协议介绍
http://www.cnblogs.com/shanyou/archive/2012/09/16/2687907.html
详解js跨域问题
https://segmentfault.com/a/1190000000718840
W3C的CORS Specification
http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-02.html
Spring通过CROS协议解决跨域问题
http://www.open-open.com/lib/view/open1463878352785.html