2012-05-10 50 views
24

我问这个问题,因为我们将开发一个应该通过JavaScript共享跨源数据的应用程序。一种可能的解决方案似乎是JSONP,因为它使用SCRIPT标签从其他域中获取数据。然而,我想避免我们假设SCRIPT标签不受sop限制并且在某些时候浏览器禁止此功能的情况下实现我们的真棒代码的情况。为什么HTML SCRIPT标签不受同源策略

任何人都可以阐明什么是脚本标签允许跨域请求的原因,一些光?

+0

出于同样的原因,标签不受其影响。 – Corbin

+0

这是什么原因,它是如何适用于(可执行的)脚本? – moritz

+6

从某种意义上说,相同的出处政策实际上是为什么脚本标记到其他域是安全的。你不会在你的标记中不小心加入脚本标记(希望不是),但是如果你不控制它,你不能保证你所包含的代码的安全性。您可能希望包含一些JS,以便您的网页上可以放置广告,但您不希望该广告网站能够访问用户的会话Cookie。 – Corbin

回答

2

这是同样的原因,你可以使用(不,在获得该文件的内容)的脚本,样式,和其他领域托管的图像。


我读the spec regerding scripts,它没有说明为什么。它说的是:

如果src具有URI值,用户代理必须忽略元素的内容并通过URI检索脚本。

检索[和执行]

+0

样式和图像本身并不危险,此外:任何Ajax请求都不允许进行跨域请求,为什么要对脚本标记进行豁免?你是否认为这是出于历史原因? – moritz

+3

@mosch [图片也可能是危险的](http://seclists.org/isn/2004/Sep/88) –

+0

样式和图片*受制于同一来源政策。对于不同来源的资源,CSSStyleSheet的'.cssRules'属性(例如'document.styleSheets [0]')是空的。如果来自另一个域的图像不能在画布上操作 –

3

我想this draft题为“同源策略的原理”解释(尽管是短暂的)什么是几乎在每个人的头上:

原则,用户代理可以将每个URL作为单独的委托人对待,并将每个文档与每个其他URL隔离开来,除非文档明确指出它信任该URL。不幸的是,这种设计对于开发人员来说很麻烦,因为Web应用程序通常由许多一致行动的资源组成。

作为近似,用户代理组的URL一起成称为起源保护域。特别是,如果两个URL具有相同的方案,主机和端口,则它们是同一来源的一部分(即代表相同的主体)。

简而言之:如果所有东西都受到SOP的限制,构建Web将会更加困难。

+0

感谢洞察力的回答,这也是GGG的链接似乎暗示了(关于图像),但我没有看到的是为什么我有一个相同的起源策略,当有简单的方法来绕过它?我可以肯定的是,在五年内,浏览器仍然使JSONP成为可能吗? – moritz

+0

@mosch:JSONP要求客户端和服务器明确协作,并且客户端完全信任服务器;我不会称这是一种简单的方法。它的工作原理是客户端和服务器之间的一个“协议”,用户代理一无所知,就像问“我怎么能确定浏览器在五年后仍然不会拒绝从包含'foo'的URL加载样式表”。 – Jon

-1

原因是因为遗留问题。它是多年前建造的,如果它现在发生变化,太多的网站将会失败。此外,安全影响是众所周知的,因为它已经存在了很长时间。