Chrome阻止不同来源的请求

40

当脚本试图访问不同来源的框架时,Chrome将其阻止并抛出异常:

"Uncaught SecurityError: Blocked a frame with origin 'provider domain' from accessing a frame with origin 'mydomain'. Protocols, domains, and ports must match".

我在Google Chrome的某次更新后遇到了这个错误。有什么建议吗?


同源策略 - epascarello
如果您尝试访问的是SSO内容,则模态对话框或弹出窗口可能是正确的选择。 - adam
2个回答

24

如果直接在框架和/或窗口之间进行Javascript调用,则只有符合同源策略才允许。 如果您的窗口和iframe共享一个共同的父域名,您可以将document.domain设置为"域名降低",以便它们之间可以通信。 否则,您需要查看类似于postMessage() API的东西。


这个答案是不正确的。我有两个框架,它们都在我的硬盘上(肯定是同一来源),但一个框架甚至不能获取另一个框架的 URL。这只发生在 Chrome 中。在 Firefox 或 IE 中没有问题。 - Elmue
@Elmue "file:" URI在同源策略方面是特殊的,部分原因是它们通常没有域组件,而本地文件访问存在安全风险。顺便说一下,SAF和FF似乎只允许文件页面在opener页面与其在同一目录或"上面"时进行通信。无论如何,当涉及浏览器安全行为时,Chrome通常处于领先地位,因此如果FF和SAF在某些时候效仿,也不要感到惊讶。 - broofa

5
这是一个安全更新。如果攻击者可以修改Web服务器中的某些文件(例如JS文件),他可以使每个加载的页面下载另一个脚本(例如记录您的密码或窃取您的SessionID并将其发送到自己的服务器)。
为了避免这种情况,浏览器会检查同源策略
你的问题是浏览器尝试使用Ajax请求加载位于另一个域(或子域)上的内容。 要避免这种情况(如果它在您自己的网站上),您可以:
  • 将元素复制到您自己的服务器上(但它将是静态的)。
  • 您可以更改HTTP标头以接受跨域内容。有关更多信息,请参见Access-Control-Allow-Origin文档

那么为什么当我调用例如 paypal.checkout.setupfacebook.login 函数时,浏览器不会抛出此错误呢?这正是从我的 URL 到 PayPal URL 的跨域请求!为什么没有错误? - Green
因为我认为你加载的包含这些函数的 JavaScript 代码是在他们的网站上。例如,你会有一个 <script src="facebook.com/foo.js"> 或者更常见的是一段创建此标签的代码。 - Binary Brain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接