将 Rails 升级到 6,出现 Blocked host 错误

Posted

技术标签:

【中文标题】将 Rails 升级到 6,出现 Blocked host 错误【英文标题】:Upgraded Rails to 6, getting Blocked host Error 【发布时间】:2019-05-21 13:15:18 【问题描述】:

我需要 ActiveStorage 中的新函数来 resize_to_fill,所以我升级到 Ruby 2.5.1 和 Rails 6。

ruby '2.5.1'

gem "rails", github: "rails/rails"

当我停止,然后启动我的服务器(Cloud 9)时,我收到了 Rails 错误:

被屏蔽的主机:xxxxxxx-xxxxxxx.c9users.io 要允许对 xxxxxxx-xxxxxxx.c9users.io 的请求,请添加以下配置:

Rails.application.config.hosts

我尝试过重新启动新窗口,但没有什么能解决这个问题。我以前从未见过这个错误。我猜新版本的 Rails 正在做些什么?

【问题讨论】:

我创建了一个新应用来测试它是我的原始应用还是每个应用。它已经在运行 ruby​​ 2.5.1。我将 Gemfile 更改为使用 edge Rails (6),gem 'rails', github: 'rails/rails',就像我之前所做的那样。我启动了服务器,它做了同样的事情,给出了同样的错误。 我将Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io" 添加到config/application.rb,它很好地修复了我的测试应用程序。然后我对我的真实应用程序做了它,它也有效。问题是,Devise 也抛出了一个错误,显然至少要到 Rails 6 beta 版才能修复。我想我会回到 Carrierwave 来满足我的图像尺寸需求,直到 ActiveStorage 更加成熟。 【参考方案1】:

简单solution:

将此行添加到config/environments/development.rb

config.hosts << /[a-z0-9-]+\.ngrok\.io/

重新启动您的 Rails 服务器,它会工作


更新

如果您过去成功使用过这个正则表达式并且它停止工作,那是因为在过去几个月中,ngrok URL 开始使用- 字符。上面的正则表达式有一个额外的字符,必须用来代替旧的(非常相似的正则表达式)。

例如这行得通

config.hosts << /[a-z0-9-]+\.ngrok\.io/ # allows dashes

这行不通

config.hosts << /[a-z0-9]+\.ngrok\.io/ # subtly different and won't allow dashes

确保您使用的是允许破折号的正则表达式!

【讨论】:

使用 ".ngrok.io" 代替正则表达式确实有效。 @s89_ 这很有趣,感谢您告诉我。您介意告诉我您使用的是什么操作系统以及什么版本的 Rails? MacOS Big Sur / Rails 6.1.3 @s89_ 嗯。我也是 macOS(我认为是 catalina)。导轨 6.0.1。也许这是一个轨道的事情。【参考方案2】:

要允许来自ngrok.io(或其他服务)的任何子域的请求,最简单的解决方案是在其前面加上.,如下所示:

# config/environments/development.rb

Rails.application.configure do

  ...

  config.hosts << '.ngrok.io'
end

不需要像其他答案中提到的那样对子域使用正则表达式。

PS:不要像其他答案中提到的那样通过 config.hosts.clear 禁用此功能,因为这违背了 Rails 的 DNS 重新绑定保护的目的,并且在适当的情况下,外部攻击者可以完全访问您的本地Rails 应用信息 (source)。

【讨论】:

【参考方案3】:

将此行添加到 config/environments/development.rb

config.hosts &lt;&lt; /.+\.ngrok\.io:\d+/

我看到的大多数响应都缺少 URL 的 port 部分。如果您在特定端口(通常为 :3000)中访问此 URL,则需要正则表达式的 :\d+ 部分。

重启服务器后即可使用。

【讨论】:

自从 Rails 6 发布以来,我一直在使用它,直到 2022 年,我才不得不将 localhost 添加到配置允许的主机中。我想可能是一个小版本添加了添加端口的要求,所以我很感激这个回应提到它。谢谢! 是的,这很奇怪。我不必为 localhost 添加它,因为它是默认添加的。除非您在某处删除默认值,否则您不需要添加它。【参考方案4】:

阻塞主机是 Rails 6 的新功能。您可以将此模式添加到您的 config/environments/development.rb 以在动态 url 的情况下不用担心

config.hosts << /[a-z0-9]+\.c9users\.io/

同样对于 ngrok 用户,只需将上面的 c9users 替换为 ngrok

更新: ngrok 目前在其 URL 中使用 -,所以这应该是准确的 config.hosts &lt;&lt; /[a-z0-9-]+\.ngrok\.io/

来源:https://github.com/MikeRogers0/puma-ngrok-tunnel

【讨论】:

最佳答案 imo,因为它显示了正则表达式的用法。值得注意的是:为了使更改生效,我必须重新启动我的 rails 服务器。是的。 老实说,这对 NGROK 用户来说是最好的解决方案,因为它可以让你摆脱那些让你无论如何都要这样做的愚蠢的宝石。 +10000 很好的答案,但是请注意 ngrok 可以在其 URL 中使用破折号 (-),因此 ngrok 的最佳正则表达式将是 config. hosts &lt;&lt; /[a-z0-9-]+\.ngrok\.io/ 只要做config.hosts &lt;&lt; '.c9users.io',这会处理任何子域并且更简单。详情见我的回答。【参考方案5】:

为了支持ngrok子域名和区域中的连字符,需要将config/environments/development.rb改为config.hosts/[a-z0-9.-]+.ngrok.io/

例子:

  config.hosts = (config.hosts rescue []) << /[a-z0-9.-]+.ngrok.io/

【讨论】:

【参考方案6】:

第一次在其中一个终端运行 ngrok 3000,然后打开新终端并运行 rails s...然后您现在可以看到 ngrok 和 rails s 都可以同时运行...

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案7】:

Rails 6中,当你想允许来自ngrok v2.3.40的主机时,将此配置添加到config/environments/development.rb

config.hosts << /[a-z0-9\-]+\.ap\.ngrok\.io/

重启服务器即可享受

【讨论】:

【参考方案8】:

我将Rails.application.config.hosts &lt;&lt; "xxxxxxx-xxxxxxx.c9users.io" 添加到config/application.rb,它很好地修复了我的测试应用程序。然后我对我的真实应用程序做了它,它也有效。问题是,Devise 也抛出了一个错误,显然至少要到 Rails 6 beta 版才能修复。我想我会回到Carrierwave 来满足我的图像尺寸需求,直到ActiveStorage 更加成熟。

【讨论】:

【参考方案9】:

注意:您可以使用配置application.config.hosts &lt;&lt; 'your_unvalid_host_name' 将您的主机列入白名单,但仍然存在错误。 在这种情况下,错误消息当前不准确。请参阅此issue。 您不应使用带下划线的主机名。 注意:application.config.hosts.clear 在这种情况下工作。

【讨论】:

【参考方案10】:

如果您想在您的开发环境中禁用此功能,您可以将config.hosts.clear 添加到config/environments/development.rb

【讨论】:

这对我不起作用,但config.hosts.clear 起作用了。 你是对的;我编辑了答案以更改它。 这是开发环境的最佳选择恕我直言。对于生产环境,最好正确设置限制。 不要这样做。禁用此功能会使您的本地主机容易受到 DNS 重新绑定攻击,从而导致攻击者可能获得对您本地 Rails 应用程序的完全访问权限。详情见我的回答。【参考方案11】:

这个article 为我工作:

    第一个选项是将config/environments/development.rb中的主机名列入白名单:

    Rails.application.configure do
      config.hosts << "hostname" # Whitelist one hostname
      config.hosts << /application\.local\Z/ # Whitelist a test domain
    end
    

    第二个选项是清除整个白名单,允许对所有主机名的请求:

    Rails.application.configure do
      config.hosts.clear
    end
    

功劳归于 Manfred Stienstra

【讨论】:

【参考方案12】:

在 Rails 6 Action Pack 中引入了 ActionDispatch::HostAuthorization 并且默认只允许 [IPAddr.new(“0.0.0.0/0”), IPAddr.new(“::/0”), “localhost”]

您可以像这样在文件 config/application.rb 中添加 RegExp、Proc、IPAddr 和 String 的数组或单个字符串

class Application < Rails::Application
  config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
  ...
end

来自“https://drivy.engineering/rails-6-unnoticed-features”:

Rails 6 添加了一个新的中间件,称为 ActionDispatch::HostAuthorization 允许您将某些主机列入白名单 为您的应用程序并防止Host header attacks。你可以 使用字符串、IPAddr、Proc 和 RegExp 轻松配置它(有用 处理通配符域时)。

【讨论】:

看到这个有点晚了,但感谢您提供的信息。我得看看这个。 Rails.application.config.hosts

以上是关于将 Rails 升级到 6,出现 Blocked host 错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails 5.2 升级到 6.0.0 后内存泄漏

解决升级Chrome浏览器之后出现跨域错误:Access to xxx has been blocked by CORS policy: XXXX

ArgumentError:升级 Rails 6.1.3 时出现错误数量的参数错误

解决升级Chrome浏览器之后出现跨域错误:Access to xxx has been blocked by CORS policy: XXXX

升级到 ruby​​ 3 和 rails 6.1 后未定义的方法“file_fixture_path”

升级到 OS Sierra 后 Rails 出现分段错误,可能与 sqlite3 gem 有关