[英]What does force_ssl do in Rails?
在上一个问题中,我发现我应该设置 nginx ssl 终止,而不是让 Rails 处理加密数据。
那么为什么会存在以下情况呢?
config.force_ssl = true
我看到这在生产配置文件中被注释掉了。 但是,如果期望 nginx 将处理所有 ssl 内容,以便我的 Rails 应用程序不处理加密数据,那么config.force_ssl = true
做什么?
如果我知道我将一直使用 nginx,我应该在生产中将其注释掉吗?
它不只是强制您的浏览器将 HTTP 重定向到 HTTPS。 它还会将您的 cookie 设置为标记为“安全”,并启用HSTS ,每个都是针对 SSL 剥离的非常好的保护。
尽管 HTTPS 保护“ https://example.com/yourapp ”上的应用程序免受 MITM 攻击,但如果有人在您的客户端和您的服务器之间进入,他们可以很容易地让您访问“ http://example.com/yourapp ” . 如果没有上述保护措施,您的浏览器将很乐意将会话 cookie 发送给执行 MITM 的人。
设置config.force_ssl
包括ActionDispatch::SSL
。 ActionDispatch::SSL
文档对功能的描述如下(为清楚起见添加了重点):
当config.force_ssl = true
,这个中间件被添加到堆栈中,并传递在config.ssl_options
设置的选项。 它执行三项工作来强制执行安全的 HTTP 请求:
TLS 重定向:将 http:// 请求永久重定向到具有相同 URL 主机、路径等的https:// 。默认启用。 设置config.ssl_options
以修改目标 URL(例如redirect: { host: "secure.widgets.com", port: 8080 }
),或设置redirect: false
以禁用此功能。
安全 cookie:在 cookie 上设置secure
标志以告诉浏览器它们不能与 http:// 请求一起发送。 默认启用。 将config.ssl_options
设置为secure_cookies: false
以禁用此功能。
HTTP 严格传输安全 (HSTS):告诉浏览器将此站点记住为仅 TLS 并自动重定向非 TLS 请求。 默认启用。 使用hsts: false
配置config.ssl_options
以禁用。 使用hsts: { … }
设置config.ssl_options
以配置 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/ } } }
此设置通过将 HTTP 请求重定向到其对应的 HTTPS 来强制使用 HTTPS。 因此,访问http://domain.com/path
的浏览器将被重定向到https://domain.com/path
。
将设置注释掉将允许两种协议。
您仍然需要配置您的 Web 服务器来处理 HTTPS 请求。
它强制与服务器的所有通信都加密并使用 SSL,即通过 HTTPS。
当您将它包含在控制器中时,该控制器将只接受 HTTPS 请求。
有用的网址:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.