【问题标题】:SSL-specific hostname in Heroku with Rails 3.1带有 Rails 3.1 的 Heroku 中特定于 SSL 的主机名
【发布时间】:2011-12-13 00:11:06
【问题描述】:

我目前有一个设置,我在我的应用程序控制器中使用此 before_filter 强制 SSL 或 http:

def force_ssl
  if params[:controller] == "sessions"
    if !request.ssl? && Rails.env.production?
      redirect_to :protocol => 'https://', :status => :moved_permanently
    end
  else
    if request.ssl? && Rails.env.production?
      redirect_to :protocol => 'http://', :status => :moved_permanently
    end
  end
end

我想做的是在使用 SSL 时使用https://secure.example.com,但在不使用 SSL 时继续使用http://example.com。有没有办法可以根据我是否使用 SSL 在主机名之间切换?

【问题讨论】:

  • 当身份验证完成后,任何人都可以破解他们的会话,例如,为什么还要强迫您的用户通过 SSL 身份验证。 firesheep,免费的会话黑客 firefox 插件。如果您尝试以这种方式使用 SSL,您并没有保护您的用户。相反,如果您的网站的某些部分需要通过 SSL 交付,那么从实际的安全角度来看,您网站的每个部分都可能也需要通过 SSL 交付(或者,至少,在身份验证之后的每个部分)。

标签: ruby-on-rails ruby ssl https hostname


【解决方案1】:

首先我将展示如何在当前版本和早期版本的 Rails 中强制使用 SSL,然后在最后我发布了如何并行使用 HTTP 和 HTTPS,这正是我认为您正在寻找的。

Rails >= 3.1

只需在您的环境配置中使用 config.force_ssl = true

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = true
  end
end

您还可以根据当前的 Rails 环境选择性地启用 https。例如,您可能希望在开发时关闭 HTTPS,并在暂存/生产时启用它。

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = false
  end
end

# config/environments/production.rb
MyApp::Application.configure do
  config.force_ssl = true
end

导轨

以防万一您有任何不是 Rails 3.1 的项目并且想要相同的功能。通过将以下行添加到您的环境配置来启用 HTTPS。

config.middleware.insert_before ActionDispatch::Static, "Rack::SSL"

请注意,我将 Rack::SSL 作为字符串传递,以在 Rails 应用程序初始化结束时委托加载类。另请注意,中间件必须插入堆栈中的特定位置,至少在ActionDispatch::StaticActionDispatch::Cookies 之前。

不要忘记在您的 Gemfile 中定义 Rack::SSL 依赖项。

# Gemfile
gem 'rack-ssl', :require => 'rack/ssl'

同时启用 HTTPS 和 HTTP

Rack::SSL 有一个非常有趣且未记录的功能。您可以传递 :exclude 选项来确定何时启用/禁用 HTTPS。

以下代码仅在请求来自 HTTPS 连接的情况下启用 Rack::SSL 及其所有过滤器。

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

以下两个 URL 将继续有效,但第一个 URL 将触发 Rack::SSL 过滤器。

https://secure.example.com
http://example.com

【讨论】:

  • 我之前使用过 force_ssl(我在 Rails 3.1 中)但是当我不想要 SSL 时我没有找到强制 http 的方法,所以我只是推出了自己的解决方案我的应用程序控制器。有没有办法自定义 force_ssl?
  • 你可以在 ForceSSL 模块中编写一个自定义的类方法,它可以做与 ForceSSL 正好相反的事情,如果你愿意,我可以发布一个例子?
猜你喜欢
  • 2018-03-04
  • 2017-05-01
  • 2012-04-16
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多