Cookie не устанавливается, когда опция безопасности включена в конфигурации rails session_store?

Ниже мой код в session_store.rb

Rails.application.config.session_store :active_record_store ,  key: '_test_key', secure: :true

Браузер получает указанные ниже заголовки ответа, когда запрашивает приложение rails с указанной выше конфигурацией:

Cache-Control:no-cache
Content-Type:text/html; charset=utf-8
Date:Fri, 10 Aug 2018 10:46:51 GMT
Location:https://xxxxx-xxxx.com/home
Server:nginx/1.12.2 + Phusion Passenger 5.2.3
Status:302 Found
Transfer-Encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Powered-By:Phusion Passenger 5.2.3
X-Request-Id:xxxxxxxxxxxe5-7f1a2bb20b23
X-Runtime:1.191833
X-XSS-Protection:1; mode=block

Проблема заключается в том, что в ответе отсутствует заголовок «Set-Cookie», который будет отправлен приложению в следующем запросе для проверки, поскольку это код состояния 302.

когда я удаляю "безопасный" из конфигурации, как показано ниже, отправляется "cookie"

Rails.application.config.session_store :active_record_store ,  key: '_test_key'

И ответ:

Cache-Control:no-cache
Content-Type:text/html; charset=utf-8
Date:Fri, 10 Aug 2018 10:38:05 GMT
Location:https://xxxxxx-wspbx.com/home
Server:nginx/1.12.2 + Phusion Passenger 5.2.3
SetCookie-:_test_key=06b1bd1397fa64af1eb9c9ed4d2e0b0b; path=/; HttpOnly
Status:302 Found
Transfer-Encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Powered-By:Phusion Passenger 5.2.3
X-Request-Id:xxxxxxxxxxxxxxxxx7-58e1baab7dc8
X-Runtime:1.207210
X-XSS-Protection:1; mode=block 

что заставляет "Set-Cookie" не отправляться в браузер, когда для session_store предоставляется опция "secure"?

0
0
621
2

Ответы 2

Вы, наверное, уже поняли это, но на всякий случай secure: true позволит отправлять cookie только через зашифрованное соединение HTTPS (SSL / TLS), которого у вас, скорее всего, нет локально.

Вы можете сделать что-то вроде:

Rails.application.config.session_store :active_record_store ,  key: '_test_key', secure: !(Rails.env.development? || Rails.env.test?)

И это будет работать, пока production использует ssl, вам может потребоваться добавить: config.force_ssl = true на ваш production.rb

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Session_Management_Cheat_Sheet.md#secure-attribute

Я решил это этим патчем обезьяны, вместо того, чтобы указывать secure:: true:

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 always secure
        # 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

Другие вопросы по теме