javascript - 不能将 document.domain 设置为 herokuapp.com 吗?如何?

标签 javascript heroku cross-domain

问题

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 ,到目前为止还没有找到任何东西。

解决方法

抱歉,如果您是来这里寻找解决方案的。到目前为止,我只找到了更多信息,但想将这个问题放在一起,以便为其他人提供可谷歌搜索的内容。我正在使用下面的一些潜在解决方法。

  1. 使用其他东西进行暂存
  2. 避免使用 Heroku 上的子域和 Heroku 上的域设置
  3. 为暂存设置子域并将其指向 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/

相关文章:

javascript - 将 jquery-ui 事件绑定(bind)到主干事件

javascript - 检查 Dynamics CRM 事件在客户端是打开还是关闭

ruby-on-rails - Heroku:为什么有这么多数据库连接?

ruby-on-rails - 未检测到 Procfile,使用默认 Web 服务器 (webrick)

javascript - 使用 JavaScript 或 jQuery 隐藏和显示元素

javascript - 允许用户仅使用一个 Lightning Web 组件实例

ruby-on-rails - 为什么我在本地 Rails 环境中正常运行时在 heroku 上出现 PG 错误?

ruby-on-rails - 设计 AJAX - POST 请求 : current_user is null

java - JBoss AS 7.1.1 中的跨域 POST

javascript - 使用 CSS (Crocodoc) 更改 DOM 元素顺序