【问题标题】:Why is same-origin-policy blocking this javascript call on a local domain?为什么同源策略会在本地域上阻止此 javascript 调用?
【发布时间】:2019-04-17 09:27:30
【问题描述】:

我在 http://mysite.local/ 上运行了一个本地开发站点 (这是一个安装了Grappelli 的 Django 管理站点,如果有任何相关性的话)。

管理站点为某些操作打开一个弹出窗口(即通过showRelatedObjectLookupPopup()

由于之前与相同来源策略的类似问题(在生产中,管理站点从 CDN 域加载一些 URL,这可以触发它)我们有一个明确设置的“规范化器”JS 函数:

document.domain = "mysite.local";

在父页面和弹出窗口中,在页面加载时。

弹出窗口包含一个带有 onclick 处理程序的链接,该处理程序在父级中触发 JS 函数:

onclick="opener.dismissRelatedLookupPopup(window, '422'); return false;"

在 Chrome 或 FF 中单击此链接会导致类似的浏览器错误:

访问属性“dismissRelatedLookupPopup”的权限被拒绝 跨域对象

阻止来源为“http://mysite.local”的框架访问 跨域框架。

弹出窗口和打开程序 URL 共享相同的协议、域和端口。

这只是本地域上的问题。在 dev/uat/production 站点(即 dev.mysite.com)上,所有这些站点的域都通过上述“normaliser”函​​数设置为超级域“mysite.com”,弹出窗口可以成功调用 JS 函数父母。

是什么阻止了它在本地域上?我错过了什么?

【问题讨论】:

  • 但是...在这种情况下,.local 不被视为顶级域吗?浏览器不会认为mysite.net 在这方面与mysite.com 不同:为什么它会认为mysite.local 不同?更改站点在本地运行的域并非易事,在我们这样做之前,我想确切了解触发 SoP 的设置是什么。
  • 是的,您可能是对的,我的第一条评论是在早上喝够咖啡之前。不过,使用 document.domain 可能会很棘手。过去在内部框架中遇到过很多问题
  • 一个想法....父页面中document.domain 的值是多少?另一个想法是使用服务器端代理来获取 iframe 的内容
  • document.domain 在父窗口和弹出窗口中分别设置为“mysite.local”。而且没有 - AFAIK - 涉及任何 iframe。弹出窗口正在尝试调用父级中的 JS 函数,并且一旦尝试访问该 JS 函数就会被阻止。我越来越倾向于你在本地运行 local.mysite.com 的建议,尽管从 SoP 的角度来看,我仍然看不出它有什么实质性的不同......
  • 好吧,我忘了是新窗口不是框架。不必在父级中设置document.domain,尽管仅在新窗口中。所以我想知道document.domain 的值在父级内部是什么

标签: javascript same-origin-policy


【解决方案1】:

根据@charlietfl 的原始建议,切换本地域似乎确实解决了这个问题。它现在在本地运行为local.mysite.com 而不是mysite.local,并且同源错误已经消失。我仍然不清楚是什么触发了错误(是因为域只有两个部分而不是三个部分吗?它是否特定于以“.local”结尾的域?)但万一其他人绊倒就这一点,这就是为我解决的问题。

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2012-08-13
    • 1970-01-01
    • 2021-02-22
    • 2015-12-08
    • 2013-11-28
    • 2021-02-22
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多