12

Rails アプリでは、セッション cookie に cookie 属性を含めるように簡単に設定できます。これは、secureHTTPS 経由で送信するときに、HTTP 以外の接続で cookie が漏洩しないようにするためです。

ただし、Rails アプリが HTTPS を使用せず、HTTP のみを使用している場合、Cookie をまったく設定していないように見えます。
これにはある程度の意味がありますが、このシナリオでは、SSL 接続の終了を担当する別のフロント エンド ロード バランサーがあります。LB から Rails アプリへの接続は HTTP のみです。

secureHTTPS を使用していない場合でも 、Rails アプリに強制的に Cookie を設定させるにはどうすればよいですか?

4

3 に答える 3

11

安全な Cookie は、定義上、安全でない接続では送信されません。

SSL アップストリームを終了することは非常に一般的ですが、Rails が正しいことを認識して実行できるように、特定のヘッダー フィールドを渡す必要があります。

これは、nginx の構成を非常に詳細に説明するドキュメントです。「ヘッダーの設定」を検索して、通過する必要がある特定のヘッダーを説明するセクションにジャンプします。

この構成にはセキュリティ上の考慮事項があります。たとえば、SSL を終端するデバイスが Rails ホストと同じ安全な LAN 上にない場合、脆弱性があります。

于 2013-02-21T13:49:09.257 に答える
0

同じ問題が発生しましたが、次のように解決しました: session_store.rb で次のように構成しました:

MyApp::Application.config.session_store :cache_store, key: COOKIE_NAME, :expire_after => 1.days, :expires_in => 1.days, :domain => 'mydomain.com', same_site: :none

, same_site: :none( HTTPを提供するときに設定されたCookieを完全に殺すため、ここには入れなかったことに注意してください)

そして、このファイルをinitializersフォルダーに配置して、Rack-> Utils-> set_cookie_header にモンキーパッチを適用しました

require 'rack/utils'
module Rack
  module Utils
    def self.set_cookie_header!(header, key, value)
      case value
      when Hash
        domain  = "; domain="  + value[:domain] if value[:domain]
        path    = "; path="    + value[:path]   if value[:path]
        max_age = "; max-age=" + value[:max_age] if value[:max_age]
        expires = "; expires=" +
            rfc2822(value[:expires].clone.gmtime) if value[:expires]

        # Make secure always, even in HTTP
        # secure = "; secure"  if value[:secure]
        secure = "; secure"

        httponly = "; HttpOnly" if value[:httponly]
        same_site =
            case value[:same_site]
            when false, nil
              nil
            when :none, 'None', :None
              '; SameSite=None'
            when :lax, 'Lax', :Lax
              '; SameSite=Lax'
            when true, :strict, 'Strict', :Strict
              '; SameSite=Strict'
            else
              raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}"
            end
        value = value[:value]
      end
      value = [value] unless Array === value
      cookie = escape(key) + "=" +
          value.map { |v| escape v }.join("&") +
          "#{domain}#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}"

      case header["Set-Cookie"]
      when nil, ''
        header["Set-Cookie"] = cookie
      when String
        header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
      when Array
        header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
      end

      nil
    end
  end
end
于 2020-04-02T11:15:27.133 に答える