【发布时间】: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