`

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

 
阅读更多

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

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

        由此我将引入和介绍CORS,希望对大家有所帮助。

定义

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

        而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进。

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

以往的解决方案

        以前要实现跨域访问,可以通过JSONP、Flash或者服务器中转的方式来实现,但是现在我们有了CORS。

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

        1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。

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

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

详细内容

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

        1、  前端

        以前我们使用Ajax,代码类似于如下的方式:

 

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

 

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

        如果我们要使用CORS,相关Ajax代码可能如下所示:

 

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

 

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

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

[html] view plaincopy
 
  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头。

        2、  服务器

        服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

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

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

 

[html] view plaincopy
 
  1. Header set Access-Control-Allow-Origin *  

 

        PHP:只需要使用如下的代码设置即可。

 

[html] view plaincopy
 
  1. <?php  
  2.  header("Access-Control-Allow-Origin:*");  

 

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

 

[html] view plaincopy
 
  1. Access-Control-Allow-Origin: http://blog.csdn.net  

 

浏览器支持情况


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

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

分享到:
评论

相关推荐

    CORS跨域资源共享及解决方案.docx

    ### CORS跨域资源共享及其解决方案详解 #### 一、CORS跨域资源共享背景 在现代Web应用开发中,前后端分离已成为一种主流趋势。在这种模式下,前端负责展示逻辑,而后端处理业务逻辑与数据交互。然而,由于浏览器...

    你可能不知道的CORS跨域资源共享

    CORS(跨域资源共享)是HTML5引入的标准跨域解决方案,它通过设置特定的HTTP头部字段,如`Access-Control-Allow-Origin`,让服务器告诉浏览器哪些来源的请求可以被允许。CORS分为简单请求和非简单请求两类。简单请求...

    跨域cors扩展插件chrome

    CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它允许浏览器在请求跨域资源时与服务器协商,通过特定的HTTP头部实现跨域访问。 描述中提到的“备用下”,意味着这个插件可能是开发者在主用工具...

    【ASP.NET编程知识】谈谈如何在ASP.NET Core中实现CORS跨域.docx

    CORS(Cross-origin resource sharing)是一种 W3C 标准,翻译过来就是「跨域资源共享」,它主要是解决 Ajax 跨域限制的问题。在 ASP.NET Core 中实现 CORS 跨域可以解决浏览器和服务器之间的跨域限制问题。 在 ASP...

    跨域的解决方案有多重JSONP、Flash、Iframe等,当然还有CORS(跨域资源共享,Cross-Origin Resource Sharing)

    然而,随着Web应用的发展,跨域数据交互的需求日益增多,因此催生了一系列跨域解决方案,包括JSONP、Flash、Iframe以及CORS(跨域资源共享,Cross-Origin Resource Sharing)。 首先,JSONP(JSON with Padding)是...

    打破壁垒:Nginx中跨域资源共享(CORS)配置全指南

    5. **模块化设计**:Nginx具有模块化的设计,可以通过添加第三方模块来扩展其功能。 6. **缓存机制**:Nginx支持HTTP缓存,可以缓存静态内容以提高响应速度和减轻后端服务器的负载。 7. **配置简单**:Nginx

    Cors跨域(四):解决方案对决JSONPvsCORS.docx

    然而,实际应用中常常需要突破这一限制,实现跨域资源共享(CORS)。为了解决跨域问题,目前主要有两种常用的技术方案:JSONP和CORS。 #### 同源策略与跨域问题 同源策略是现代浏览器为确保网页安全性而实施的一项...

    跨域图片资源权限(CORS enabled image)

    跨域图片资源权限(CORS enabled image)是指在Web页面中,当使用canvas元素加载并展示其他域(即非当前源)的图片...开发者应当熟悉相关的CORS设置以及浏览器的行为,从而在跨域资源共享时,确保应用的安全性和性能。

    HTML5平台中跨域访问使用说明

    跨域资源共享(CORS)是解决这个问题的关键技术。本文档将深入探讨如何在HTML5中实现跨域访问,帮助开发者避免修改大量代码,提高工作效率。 一、什么是跨域? 在Web开发中,"同源策略"是一项重要的安全机制,它...

    JQuery跨域访问解决方案

    如果需要使用POST方式进行跨域,可以采取其他技术,如CORS(跨源资源共享)或使用IFrame和窗体提交。但是,jQuery本身并不直接支持JSONP之外的跨域POST请求。 在上面的例子中,`$.ajax()`方法用于发起跨域请求,`...

    学习总结:前端跨域请求的解决办法——JSONP

    相比于JSONP,CORS(Cross-Origin Resource Sharing,跨源资源共享)提供了更安全、更灵活的跨域解决方案,支持所有HTTP方法,可以携带Cookie,并且有完整的错误处理机制。但是,CORS需要服务器端的支持,而JSONP...

    浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

    然而,为了实现跨域数据交换,开发者们发展出了两种常见方法:JSONP(JSON with Padding)和CORS(Cross-Origin Resource Sharing,跨域资源共享)。下面我们将深入探讨这两种技术的原理及其应用。 ### JSONP原理 ...

    WebUploadTest(跨域)

    跨域上传文件涉及到浏览器的同源策略限制,以及如何通过CORS(跨源资源共享)等技术来克服这些限制。 【正文】 在Web应用中,跨域是指一个域下的文档或脚本尝试访问另一个域下的资源。由于浏览器的安全策略——...

    html5 ajax 文件上传跨域进度问题

    1. **CORS(跨源资源共享)**: HTML5引入了CORS来解决跨域问题,允许服务器声明哪些来源可以访问其资源。在服务器端,你需要设置合适的响应头`Access-Control-Allow-Origin`,比如设置为`*`表示允许所有来源,或者...

    谷歌跨域插件allow-cors-access-control.zip

    跨域资源共享(CORS)是一种机制,它允许Web应用程序从不同的源请求资源,比如JavaScript通过Ajax从非同源的服务器获取数据。在默认情况下,由于浏览器的同源策略限制,这种跨域请求会被阻止。CORS通过设置特定的...

    06课 跨域、jsonp与cors.rar

    本课程将深入探讨如何突破这一限制,实现跨域通信,主要涉及三个关键技术:JSONP、CORS(跨源资源共享)以及它们在HTML中的应用。 首先,让我们理解什么是“跨域”。同源策略规定,一个域下的文档或脚本只能读取...

    主题:javascript最全的10种跨域共享的方法.docx

    因此,跨域资源共享成为了一项挑战,但也催生了许多创新的解决策略。这些策略通常分为两类:单向数据请求和双向消息通信。 1. JSONP(JSON with Padding): JSONP是一种简单的跨域解决方案,通过动态插入`...

    跨域引用资源技术

    在实际应用中,以下两种技术常用于跨域资源请求: 1. **配置反向代理**:反向代理服务器(如Nginx或Apache)可以接收来自不同源的请求,并将它们转发到同一源的资源。这样,不同域名的客户端可以通过代理服务器访问...

    跨域的三个html例子

    1. **CORS(Cross-Origin Resource Sharing)跨域资源共享**:这是现代浏览器最常用的一种跨域方式。通过设置服务器响应头`Access-Control-Allow-Origin`,可以允许特定或所有来源的页面请求其资源。例如,在HTML...

Global site tag (gtag.js) - Google Analytics