【问题标题】:Why does this cross-domain ajax call actually work?为什么这个跨域 ajax 调用真的有效?
【发布时间】:2012-08-28 23:45:54
【问题描述】:

我无意中写了一个对NextBus的跨域AJAX调用(使用jQuery):

$.ajax({
      url: 'http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=sf-muni&r=1&s=6294',
      dataType: 'xml',
      success: function(data) {
           do_stuff();
      }
});

问题是,它适用于所有浏览器,尽管来自不同的域。鉴于单一来源政策,为什么这实际上有效?

页面在这里:http://sftransitfirst.org/F/,从下拉菜单中选择一个停止会触发 ajax。

正如预期的那样,对 Google Maps API Web Services 进行类似的调用会失败并使用熟悉的 Origin ... is not allowed by Access-Control-Allow-Origin(并且它不支持 jsonp)。

【问题讨论】:

  • 我认为是因为 Google URL 是“https”?不确定
  • 来自该 URL 的响应标头集包含 Access-Control-Allow-Origin: *CORS
  • @Rob 把它写成答案;)

标签: jquery ajax web-services cross-domain


【解决方案1】:

他们必须明确允许跨域访问,以这种方式:

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

或者使用 htaccess:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

【讨论】:

  • 不过,我认为 SOP 是一种客户端(浏览器)安全措施。允许远程 web 服务覆盖策略似乎违背了目的,不是吗?即您不应该信任来自另一个域的任何旧资源。
  • @carillonator 首先,SOP 防止来自不同来源的脚本访问彼此的方法和属性,例如防止第三方脚本读取您的脚本设置的 cookie。
  • @carillonator 我可以看到它似乎存在安全风险。但是这种设置将(应该)仅在希望访问内容的站点(例如,twitter)上启用。从安全的角度来看,您正在查看的站点还必须调用允许所有允许来源的站点。因此,从“黑客”担忧的角度来看,已经需要访问权限来插入对其他站点的调用,或者启用根目录中的访问权限,这两个站点的安全性都已经受到了极大的威胁。
【解决方案2】:

许多现代 Web API 支持 Cross-Domain Resource Sharing (CORS)。 CORS 是一种让网站自愿让其页面可用于跨域脚本的方法。来自服务器的Access-Control-Allow-Origin HTTP 标头向您的 Web 浏览器发出信号,表明允许脚本使用 Ajax 访问页面是可以的,即使脚本在不同的源上运行也是如此。如果服务器不提供 CORS 标头,您的浏览器将照常执行 SOP。

大多数 API 选择将其页面公开给跨域脚本,因为他们知道几乎所有用户都希望能够通过 Ajax 从自己的域访问 API。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2012-05-16
    • 2013-11-27
    • 2015-06-12
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多