force_ssl在Rails中做了什么?

use*_*220 79 ssl ruby-on-rails nginx

在之前的一个问题中,我发现我应该设置nginx ssl终止,而不是让Rails处理加密数据.

那为什么以下存在呢?

config.force_ssl = true
Run Code Online (Sandbox Code Playgroud)

我在生产配置文件中看到了这个注释.但是,如果期望nginx将处理所有ssl的东西,以便我的rails应用程序不处理加密数据,那么做config.force_ssl = true什么?

如果我知道我将永远使用nginx,我应该把它留在生产中注释掉吗?

Dan*_*son 74

不仅强制您的浏览器将HTTP重定向到HTTPS.它还将您的cookie设置为"安全",并启用HSTS,每个HSTS都可以很好地防止SSL剥离.

即使HTTPS在" https://example.com/yourapp "上针对MITM攻击保护您的应用,如果有人在您的客户端和服务器之间进行访问,他们也可以轻松地让您访问" http://example.com/yourapp " .如果没有上述保护措施,您的浏览器将很乐意将会话cookie发送给执行MITM的人员.

  • @agios这是一个单独的每个控制器`force_ssl`属性.`force_ssl`配置变量,它安装`Rack :: SSL`中间件,[默认情况下会启用HSTS](https://github.com/josh/rack-ssl/blob/master/lib/rack/ssl .RB#L61). (13认同)
  • 听起来像`config.force_ssl = true`应该是默认值,为什么rails团队将其注释为默认值? (4认同)

ste*_*eel 50

设置config.force_ssl包括ActionDispatch::SSL.该ActionDispatch::SSL文档描述的功能如下(添加的,为了清楚起见重点):

请参阅包括在这里和ActionDispatch :: SSL的文档在这里.

DOCS

当中间件被添加到堆栈中时config.force_ssl = true,会传递设置的选项config.ssl_options.它执行三个作业来强制执行安全的HTTP请求:

  1. TLS重定向: 使用相同的URL主机,路径等永久地将http://请求重定向到https://.默认情况下启用.设置config.ssl_options 为修改目标URL(例如redirect: { host: "secure.widgets.com", port: 8080 }),或设置 redirect: false为禁用此功能.

  2. 安全cookie:设置secure cookie上标志,告诉浏览器它们不能与http://请求一起发送.默认情况下启用.设置 config.ssl_optionssecure_cookies: false禁用此功能.

  3. HTTP严格传输安全性(HSTS):告诉浏览器将此站点记住为仅TLS并自动重定向非TLS请求.默认情况下启用.配置config.ssl_optionshsts: false禁用.设置config.ssl_optionshsts: { … }配置HSTS:

    • expires:这些设置会持续多久,以秒为单位.默认为 180.days(推荐).符合浏览器预加载列表的最低要求是18.weeks.
    • subdomains:设置为true告诉浏览器将这些设置应用于所有子域.这可以保护您的cookie免受子域上易受攻击的站点的拦截.默认为true.
    • preload:宣传该网站可能包含在浏览器的预加载HSTS列表中.除了第一次访问之外, HSTS会在每次访问时保护您的网站,因为它还没有看到您的HSTS标头.为了弥补这一差距,浏览器供应商提供了一个启用HSTS的站点的烘焙列表.转到https://hstspreload.appspot.com提交您的网站以供收录.要关闭HSTS,省略标题是不够的.浏览器会记住原始的HSTS指令,直到它过期.相反,使用标头告诉浏览器立即使HSTS过期.设置hsts: false是一个快捷方式hsts: { expires: 0 }.

请求可以选择退出重定向exclude:

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }
Run Code Online (Sandbox Code Playgroud)

  • "请求可以通过`exclude`选择退出重定向" - 警告:此功能最近才在Rails 5中添加,因此对于我们这些在Rails 4.2或更低版本上的用户不起作用 (3认同)

Ste*_*fan 10

此设置通过将HTTP请求重定向到其HTTPS对应项来强制HTTPS.因此浏览器访问http://domain.com/path将被重定向到https://domain.com/path.

保留注释的设置将允许两种协议.

您仍然必须配置Web服务器以处理HTTPS请求.

  • 但是,如果您在 nginx 级别启用 HTTPS(通过通过 `redirect 301 https:...` 将所有内容重定向到 HTTPS),则一切都不会通过 https,因此 `config.force_ssl = true` 并没有真正做任何事情(因为什么都不会是http)?还是这里有更深层次的安全原因? (2认同)
  • @TristanTao是的,这也可以.但即使这样,我也会启用`config.force_ssl`,以防万一有人从Web服务器的配置中删除重定向. (2认同)
  • 小心doh,config.force_ssl与控制器中的force_ssl有点不同,在这里更多地保护cookie免受会话劫持:http://www.eq8.eu/blogs/14-config-force_ssl-is-different-than-controller -force_ssl (2认同)

Ric*_*dan 6

它强制与服务器的所有通信进行加密并使用 SSL,即通过 HTTPS。

当您将其包含在控制器中时,该控制器将仅接受 HTTPS 请求。

有用的网址:

  1. http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
  2. http://rubydoc.info/docs/rails/ActionController/ForceSSL
  3. http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=comments