TML5安全:CORS(跨域资源共享)简介

来源:http://blog.csdn.net/hfahe/article/details/7730944 javascript

 前言:像CORS对于现代前端这么重要的技术在国内基本上竟然不多有人使用和说起,在百度或者Google上搜索CORS,搜到的中文文章基本都是另一种卫星定位技术CORS的介绍,让我等前端同窗情何以堪(对比起来,用Google搜到的国外文章,基本都是跨域资源共享的介绍,说明了前端技术在国内外环境和发展的巨大差距)。php

        我以前《用HTML5实现人脸识别》这篇文章中提到了“Face.com实现了CORS(跨域资源共享)。CORS系统基本上可让服务器暴露给其它域上文件的Ajax调用。这是一个伟大的功能,我但愿更多的服务可以使用它。”在这篇文章介绍的实现方式里,咱们能够自由的使用本身本域的JS代码经过Ajax来调用Face.com的API,这是一种很美妙的方式,而在之前咱们很难作到这一点。html

        由此我将引入和介绍CORS,但愿对你们有所帮助。前端

定义html5

        CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,容许网页从不一样的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来肯定是否容许跨域请求。 它是一个妥协,有更大的灵活性,但比起简单地容许全部这些的要求来讲更加安全。java

        而W3C的官方文档目前仍是工做草案,可是正在朝着W3C推荐的方向前进。api

        简言之,CORS就是为了让AJAX能够实现可控的跨域访问而生的。跨域

以往的解决方案浏览器

        之前要实现跨域访问,能够经过JSONP、Flash或者服务器中转的方式来实现,可是如今咱们有了CORS。安全

        CORS与JSONP相比,无疑更为先进、方便和可靠。

        一、 JSONP只能实现GET请求,而CORS支持全部类型的HTTP请求。

        二、 使用CORS,开发者可使用普通的XMLHttpRequest发起请求和得到数据,比起JSONP有更好的错误处理。

        三、 JSONP主要被老的浏览器支持,它们每每不支持CORS,而绝大多数现代浏览器都已经支持了CORS(这部分会在后文浏览器支持部分介绍)。

详细内容

        要使用CORS,咱们须要了解前端和服务器端的使用方法。

        一、  前端

        之前咱们使用Ajax,代码相似于以下的方式:

 

  1. var xhr = new XMLHttpRequest();  
  2. xhr.open("GET", "/hfahe", true);  
  3. xhr.send();  

 

        这里的“/hfahe”是本域的相对路径。

        若是咱们要使用CORS,相关Ajax代码可能以下所示:

 

  1. var xhr = new XMLHttpRequest();  
  2. xhr.open("GET", "http://blog.csdn.net/hfahe", true);  
  3. xhr.send();  

 

        请注意,代码与以前的区别就在于相对路径换成了其余域的绝对路径,也就是你要跨域访问的接口地址。

        咱们还必须提供浏览器回退功能检测和支持,避免浏览器不支持的状况。

  1. function createCORSRequest(method, url) {  
  2.   var xhr = new XMLHttpRequest();  
  3.   if ("withCredentials" in xhr) {  
  4.     // 此时即支持CORS的状况  
  5.     // 检查XMLHttpRequest对象是否有“withCredentials”属性  
  6.     // “withCredentials”仅存在于XMLHTTPRequest2对象里  
  7.     xhr.open(method, url, true);  
  8.    
  9.   } else if (typeof!= "undefined") {  
  10.    
  11.     // 不然检查是否支持XDomainRequest,IE8和IE9支持  
  12.     // XDomainRequest仅存在于IE中,是IE用于支持CORS请求的方式  
  13.     xhr = new XDomainRequest();  
  14.     xhr.open(method, url);  
  15.    
  16.   } else {  
  17.    
  18.     // 不然,浏览器不支持CORS  
  19.     xhr = null;  
  20.    
  21.   }  
  22.   return xhr;  
  23. }  
  24.    
  25. var xhr = createCORSRequest('GET', url);  
  26. if (!xhr) {  
  27.   throw new Error('CORS not supported');  
  28. }  

        如今若是直接使用上面的脚本进行请求,会看到浏览器里控制台的报错以下:

        错误显示的很明显,这是由于咱们还未设置Access-Control-Allow-Origin头。

        二、  服务器

        服务器端对于CORS的支持,主要就是经过设置Access-Control-Allow-Origin来进行的。若是浏览器检测到相应的设置,就能够容许Ajax进行跨域的访问。

        HTTP 头的设置方法有不少,http://enable-cors.org/这篇文章里对各类服务器和语言的设置都有详细的介绍,下面咱们主要介绍Apache和PHP里的设置方法。

        Apache:Apache须要使用mod_headers模块来激活HTTP头的设置,它默认是激活的。你只须要在Apache配置文件的<Directory>, <Location>, <Files>或<VirtualHost>的配置里加入如下内容便可:

 

  1. Header set Access-Control-Allow-Origin *  

 

        PHP:只须要使用以下的代码设置便可。

 

  1. <?php  
  2.  header("Access-Control-Allow-Origin:*");  

 

        以上的配置的含义是容许任何域发起的请求均可以获取当前服务器的数据。固然,这样有很大的危险性,恶意站点可能经过XSS攻击咱们的服务器。因此咱们应该尽可能有针对性的对限制安全的来源,例以下面的设置使得只有http://blog.csdn.net这个域才能跨域访问服务器的API。

 

  1. Access-Control-Allow-Origin: http://blog.csdn.net  

 

浏览器支持状况


        上图为各浏览器对于CORS的支持状况(绿色为支持,数据来源:http://caniuse.com/cors),看起来至关乐观。主流浏览器都已基本提供对跨域资源共享的支持,因此,CORS才会在国外使用的如此广泛。

        上文曾经提到,IE8和IE9在某种程度上能够经过XDomainRequest来提供一样功能的支持。

使用案例

        目前国外支持CORS的平台有不少,例如:

 

        Google APIClient Library for JS

        Google CloudStorage

 

        Face.com API

将来

        从全部的浏览器都支持来看,CORS将成为将来跨域访问的标准解决方案。不管是本身服务器间的跨域访问,仍是开放平台为第三方提供API,都将采用这种统一的解决方案,由于它简单、高效,受到全部主流浏览器的支持。它很是重要,也会让咱们的网络变得更加开放。

参考文章

        IE10中的CORS forXHR

        USING CORS

今天我就说到这里了,但愿你们喜欢这篇教程。

如需转载烦请注明出处:W3CPLUS

相关文章
相关标签/搜索