问题
在#{some_app}.herokuapp.com
上运行的临时应用程序的document.domain = '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以绕过此问题
相关
我还发布了这个关于设置域的问题(从Rails设置document.domain的DRY方式)。我很想知道是否也有更好的解决方案。
虽然document.domain
并没有得到专门的解决,但Heroku的这篇文章解释了它的工作原理和原因。
tl;dr
为什么:这很危险。
如何:herokuapp.com包含在Mozilla基金会的公共后缀列表中