`
tempsitegoogle
  • 浏览: 874318 次
文章分类
社区版块
存档分类
最新评论

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,代码类似于如下的方式:

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

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

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

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

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

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

function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // 此时即支持CORS的情况
    // 检查XMLHttpRequest对象是否有“withCredentials”属性
    // “withCredentials”仅存在于XMLHTTPRequest2对象里
    xhr.open(method, url, true);
 
  } else if (typeof!= "undefined") {
 
    // 否则检查是否支持XDomainRequest,IE8和IE9支持
    // XDomainRequest仅存在于IE中,是IE用于支持CORS请求的方式
    xhr = new XDomainRequest();
    xhr.open(method, url);
 
  } else {
 
    // 否则,浏览器不支持CORS
    xhr = null;
 
  }
  return xhr;
}
 
var xhr = createCORSRequest('GET', url);
if (!xhr) {
  throw new Error('CORS not supported');
}

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


错误显示的很明显,这是因为我们还未设置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>的配置里加入以下内容即可:

Header set Access-Control-Allow-Origin *

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

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

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

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

原创文章,转载请注明:来自蒋宇捷的博客(http://blog.csdn.net/hfahe)

分享到:
评论

相关推荐

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

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

    【JavaScript源代码】Ajax解决跨域之设置CORS响应头实现跨域案例详解.docx

    设置CORS响应头实现跨域 跨源资源共享(CORS) CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS 是官方的跨域解决方 案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持 ...

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

    由于同源策略的缘故,ajax不能向不同域的网站发出请求。...html&gt; [removed][removed] [removed] $.get("http://www.walk-sing.com/api.php", function(data){ alert&#40;"Data Loaded: " + data&#41;;

    什么是跨域解决方案有哪些.docx

    1. 跨域资源共享(CORS) 2. 通过 jsonp 跨域 3. document.domain + iframe 跨域 4. location.hash + iframe 5. window.name + iframe 跨域 6. postMessage 跨域 7. nginx 代理跨域 8. nodejs 中间件代理跨域 9. ...

    什么是跨域?跨域解决方法.docx

    跨域问题解决方法 一、什么是跨域? 跨域是指一个域的 JavaScript 脚本和另外一个域的内容...CORS 是跨域资源共享的缩写,是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。它可以实现跨域资源的共享,解决跨域问题。

    HTML5终极指南:2021年发展趋势14个预测.docx

    在这个终极指南中,我们将探讨 HTML5 在 2021 年的发展趋势,包括更多有用的开放接口 API、CORS 跨域资源共享、语义信息和 Microdata 等技术的应用。 一、欢迎来到更加互联的 Web 世界 HTML5 将增加更多有用的开放...

    任何使用 HTML、CSS 和 JavaScript 的 URL 下载器以及源代码

    安全文件获取:通过使用 cors-anywhere 代理,下载器可以安全地获取文件,克服 CORS(跨域资源共享)限制。 使用的技术: HTML格式:网页的结构是使用 HTML 定义的,为内容和用户交互奠定了基础。 CSS格式:样式是...

    Html5video标签访问网络摄像机实时监控.pdf

    10、跨域资源共享(CORS):在Node.js中,需要注意跨域资源共享的问题,否则可能会出现安全问题。例如,在使用Node.js和Html5视频标签时,需要确保Node.js服务器和Html5视频标签在同一个域名下,以避免跨域问题。 ...

    Cross Domain - CORS-crx插件

    访问网站:https://devratroom.blogspot.com/p/cross-domain-cors-extension.html跨域将帮助您处理跨域-跨域资源共享(CORS)问题。 这是一个小工具,对面对跨域问题的Web开发人员和相关领域很有帮助。 功能列表:-...

    允许CORS:访问控制 - 允许来源「Allow CORS: Access-Control-Allow-Origin」-crx插件

    默认情况下,现代浏览器(在JavaScript API中)禁止CORS或跨源资源共享。安装此加载项将使您可以解除阻止此功能。请注意,将插件添加到浏览器后,默认情况下它处于非活动状态(工具栏图标为灰色C字母)。如果要激活...

    2023年最新前端面试题

    CORS(跨域资源共享)是一种用于解决跨域请求的标准。它允许服务器在响应中设置特定的 HTTP 头,表明哪些域名有权限访问资源。浏览器在发起跨域请求时会先发出一个预检请求(OPTIONS 请求),服务器根据请求头中的 ...

    NBAContentAPI:用于 NBA 内容 API 的非官方 JavaScript 客户端库

    #NBA 内容 API Javascript 库 用于非官方 JavaScript 客户端库。 该库支持 JSON API 调用。 未来版本将支持 XML API 调用。... ###CORS 跨域资源共享 (CORS) 可防止来自 NBA 域 ( ) 之外的域的 AJAX 或 XMLHttpReq

    HTML5安全风险详析

    CORS-CrossOriginResourcesSharing,也即跨源资源共享,它定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全。简言之,CORS...

    Allow CORS: Access-Control-Allow-Origin-crx插件

    默认情况下,CORS或CROSS原点资源共享在现代浏览器中被阻止(在JavaScript API中)。 安装此加载项将允许您取消阻止此功能。 请注意,当添加到浏览器时,默认情况下,它会激活(工具栏图标为灰色C字母)。 如果要...

    HTML5安全介绍之内容安全策略(CSP)简介

    前言:HTML5出现后,网络安全更加受到广泛的关注。Web对于网络安全有哪些改进?我们如何来面对越来越危险的网络欺诈和攻击...未来有机会的话,我会针对XSS、P3P、同源策略、CORS(跨域资源共享)和CSP进行关于HTML5内容

    详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】

    3.4、跨域资源共享(CORS) 3.5、小结 四、弹出层 五、模板引擎 5.1、Hello World 5.2、方法 5.3、与AJAX结合应用 六、示例下载 一、AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和...

Global site tag (gtag.js) - Google Analytics