zoukankan      html  css  js  c++  java
  • CORS 协议(跨域资源共享)

     

    跨域问题

    只要协议、域名、端口有任何一个不同,都被当作是不同的域。

    image

     

    为什么会有跨域的限制?

    之前发生过的一些跨域安全事件:

    新浪微博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

    image

    • 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 的工作流

    image

    图来自: 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 的 流程图

    cors_server_flowchart

    图来自: 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

  • 相关阅读:
    property里的参数
    property关键字的理解
    OC与C语言的几点区别
    C语言学习心得
    QQ第三方<接口>
    为什么选择Redis
    版本控制器
    url传参及重定向
    开发的四个环境
    Paxos分析
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5692612.html
Copyright © 2011-2022 走看看