是否无法将document.domain设置为herokuapp.com?怎样



问题

#{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并触发了相同的错误。我检查了响应标头,到目前为止还没有发现任何内容。

工作激励

如果你来这里寻求解决方案,我很抱歉。到目前为止,我只找到了更多的信息,但我想把这个问题放在一起,为其他人提供一些谷歌上的东西。我正在使用以下一些潜在的解决方案。

  1. 使用其他东西进行暂存
  2. 避免Heroku上的子域和Heroku的域设置
  3. 为暂存设置子域,并将其指向Heroku以绕过此问题

相关

我还发布了这个关于设置域的问题(从Rails设置document.domain的DRY方式)。我很想知道是否也有更好的解决方案。

虽然document.domain并没有得到专门的解决,但Heroku的这篇文章解释了它的工作原理和原因。

tl;dr

为什么:这很危险。

如何:herokuapp.com包含在Mozilla基金会的公共后缀列表中

相关内容

  • 没有找到相关文章

最新更新