将Rails升级到6,得到阻止的主机错误

Ton*_* S. 6 ruby-on-rails cloud9 ruby-on-rails-6

我需要ActiveStorage中的新函数resize_to_fill,因此我升级到了Ruby 2.5.1和Rails 6。

ruby '2.5.1'

gem "rails", github: "rails/rails"
Run Code Online (Sandbox Code Playgroud)

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

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

Rails.application.config.hosts <<“ xxxxxxx-xxxxxxx.c9users.io”

我尝试过重新启动,新窗口,但是没有任何东西可以解决。我以前从未见过此错误。我猜新版本的Rails正在做什么?

小智 67

The Blocked Host 是 Rails 6 的一个新特性。你可以添加这个模式到你config/environments/development.rb的动态 url 中不用担心

config.hosts << /[a-z0-9]+\.c9users\.io/
Run Code Online (Sandbox Code Playgroud)

同样对于 ngrok 用户,只需将上面替换c9usersngrok

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

  • 免费帐户需要 `config.hosts &lt;&lt; /[a-z0-9\-]+\.ngrok-free\.app/` (5认同)
  • 很好的答案,但是请注意,ngrok 可以在其 URL 中使用破折号 (-),因此 ngrok 的最佳正则表达式将是 `config.php'。主机 &lt;&lt; /[a-z0-9-]+\.ngrok\.io/` (3认同)
  • 最佳答案我认为,因为它显示了正则表达式的用法。值得注意的是:我必须**重新启动我的 Rails 服务器**才能使更改生效。嗯嗯。 (2认同)

Jer*_*ert 16

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

# config/environments/development.rb

Rails.application.configure do

  ...

  config.hosts << '.ngrok.io'
end
Run Code Online (Sandbox Code Playgroud)

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

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


Kir*_*eas 10

这篇文章对我有用:

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

    Rails.application.configure do
      config.hosts << "hostname" # Whitelist one hostname
      config.hosts << /application\.local\Z/ # Whitelist a test domain
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个选项是清除整个白名单,它允许通过对所有主机名的请求:

    Rails.application.configure do
      config.hosts.clear
    end
    
    Run Code Online (Sandbox Code Playgroud)

幸得曼弗雷德Stienstra


use*_*745 9

简单的解决方案:

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

config.hosts << /[a-z0-9]+\.ngrok\.io/
Run Code Online (Sandbox Code Playgroud)

重新启动你的 rails 服务器,它会工作


kob*_*ltz 6

如果要在开发环境中禁用此功能,可以设置

config.hosts = nil在中config/environments/development.rb

  • 不要这样做。禁用此功能会使您的本地主机容易受到 DNS 重新绑定攻击,从而导致攻击者可能获得对本地 Rails 应用程序的完全访问权限。详情请参阅我的回答。 (3认同)
  • 这对我不起作用,但“config.hosts.clear”却有用。 (2认同)

Don*_*ppo 5

在 Rails 6 Action Pack 中引入了 ActionDispatch::HostAuthorization,默认情况下仅允许 [IPAddr.new(\xe2\x80\x9c0.0.0.0/0\xe2\x80\x9d), IPAddr.new(\xe2\x80\x9c) ::/0\xe2\x80\x9d), \xe2\x80\x9clocalhost\xe2\x80\x9d]

\n\n

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

\n\n
class Application < Rails::Application\n  config.hosts << "xxxxxxx-xxxxxxx.c9users.io"\n  ...\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

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

\n
\n


Ton*_* S. 5

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


小智 5

config.hosts = nil

使用它development.rb并重新启动你的rails服务器,它对我有用,它会起作用。