【问题标题】:How to force a secure cookie over HTTP with Rails如何使用 Rails 通过 HTTP 强制使用安全 cookie
【发布时间】:2015-05-28 14:00:19
【问题描述】:

我正在使用位于反向代理服务器 (Nginx) 后面的 Rails 应用程序,我需要将 Rails 应用程序的会话 cookie 标记为 Secure。但是,当我像下面这样设置时,

Application.config.session_store :cookie_store, :key => '_app_session', :secure => true

Rails 停止发送 _app_session cookie。

我知道 Rails 阻止了它,因为我直接使用 curl -v 访问 Rails,当我省略 :secure => true 时,我可以看到 _app_session cookie。

如何强制 Rails 通过 HTTP 连接发送安全 cookie?

注意:在这种特定情况下,可以通过 HTTP 发送安全 cookie。此流量发生在一个被认为是安全的区域,然后才被 SSL 包裹并发送到世界各地。此外,“terminating SSL upstream is quite common”,所以我不是第一个有这种设置的人。

替代方案(什么不起作用)

这是我已经尝试过的:

我在 Lua 中编写了一个脚本,将 Secure 添加到 cookie 中。它有效,但我的老板说我们不能在 Nginx 中使用 Lua。

我不知道如何在 Nginx 中使用以下指令来实现我想要的:

  • $http_header
  • proxy_set_header
  • more_set_headers
  • $cookie_COOKIE

我尝试按照here 的建议添加set_proxy_headeradd_header,但没有奏效,我怀疑可能是我们的设置有一些特殊的原因。

最后,假设我可以为 Nginx 编写一个 C 模块,但我不会这样做。

【问题讨论】:

    标签: ruby-on-rails security ssl cookies nginx


    【解决方案1】:

    我在我的 Nginx conf 文件中的相关 location 块中添加了以下内容:

    proxy_set_header X-Forwarded-Proto https;

    以前没有用,因为我在问题中链接的建议下使用了X-Forwarded-Proto $scheme。我不知道为什么这不起作用,但是这样做

    $ curl -v -H "X-Forwarded-Proto: https" http://localhost:95/app-path

    确实返回了预期的 _app_session cookie,并设置了 Secure 标志,因此很明显,RoR 只需要知道安全 cookie 最终会通过 https 发送出去。

    更新(2015 年 6 月)

    我遇到这个问题的原因是因为我们的服务器代理将http 请求传递给自己以获取https,而不是首先设置X-Forwarded-Proto。一旦我更好地理解了我们的拓扑结构,我就能够在第一次代理通过之前执行X-Forwarded-Proto $scheme。这是正确的解决方案。

    【讨论】:

      【解决方案2】:

      您应该查看 rack-ssl-enforcer gem。消除了 Rails 的问题,并且可以根据您的需要进行高度配置。

      【讨论】:

        【解决方案3】:

        如果您的应用程序始终是安全的,最好的方法是将proxy_cookie_flags(自 Nginx 版本 1.19.3 起)配置添加到您的 Nginx(在您想要的 location 中)。不需要额外的脚本。

        对于所有 cookie 使用:

        proxy_cookie_flags ~ secure;

        在文档中查看更多信息:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_flags

        【讨论】:

          猜你喜欢
          • 2013-02-06
          • 2020-11-16
          • 2012-10-06
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2018-03-29
          相关资源
          最近更新 更多