问题
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 并触发相同的错误。我检查了响应 header ,到目前为止还没有找到任何东西。
解决方法
抱歉,如果您是来这里寻找解决方案的。到目前为止,我只找到了更多信息,但想将这个问题放在一起,以便为其他人提供可谷歌搜索的内容。我正在使用下面的一些潜在解决方法。
- 使用其他东西进行暂存
- 避免使用 Heroku 上的子域和 Heroku 上的域设置
- 为暂存设置子域并将其指向 Heroku 以解决此问题
相关
我还发布了这个关于首先设置域的问题 ( DRY way for setting document.domain from Rails )。我很想知道是否也有更好的解决方案。
最佳答案
虽然 document.domain
没有具体解决 this article from Heroku解释这是如何以及为什么有效的。
tl;dr
原因:这很危险。
如何:herokuapp.com 包含在 Mozilla 基金会的 Public Suffix List 中
关于javascript - 不能将 document.domain 设置为 herokuapp.com 吗?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318148/