【发布时间】:2016-07-19 00:09:23
【问题描述】:
问题
document.domain = 'herokuapp.com' 对于在#{some_app}.herokuapp.com 运行的暂存应用程序会出现以下控制台错误:
Uncaught SecurityError: Failed to set the 'domain' property on 'Document': 'herokuapp.com' is a top-level domain.
调查
通过尝试将域设置为页面的 TLD,我可以在任何页面上触发此错误。例如,现在拉开控制台并尝试运行document.domain = 'com'。
您不希望文档的域成为 TLD,因为这将允许来自同一 TLD 的任何脚本与其通信。从那里推断很明显,任何 Heroku 应用程序都可以与域为 herokuapp.com 的应用程序通信,因为它们都在 herokuapp.com 的子域上运行。对于没有在一天结束时严格禁用暂存应用程序的任何人来说,这可能是一个安全问题。
从我的观察来看,Heroku 似乎谨慎地通过禁止将 herokuapp.com 设置为他们的页面域来保护他们的客户。他们是怎么做到的?我认为可以安全地假设浏览器知道在所有 TLD 上出错,但不知何故 herokuapp.com 被浏览器注册为 TLD 并触发相同的错误。我检查了响应头,到目前为止还没有找到任何东西。
工作环境
很抱歉,如果您来这里寻找解决方案。到目前为止,我只找到了更多信息,但想把这个问题放在一起,以便为其他人提供一些可谷歌搜索的东西。我正在使用下面的一些潜在解决方法。
- 使用其他东西进行暂存
- 避免 Heroku 上的子域和 Heroku 上的域设置
- 为暂存设置子域并将其指向 Heroku 以解决此问题
相关
我还发布了这个关于首先设置域的问题 (DRY way for setting document.domain from Rails)。我很想知道是否有更好的解决方案。
【问题讨论】:
标签: javascript heroku cross-domain