Подтвердить что ты не робот

Как я могу сделать cookie безопасным (только https-only) по умолчанию в rails?

В контроллере Rails я могу настроить файл cookie следующим образом:

cookies[:foo] = "bar"

И укажите, что флаг "secure" (https-only) должен быть следующим:

cookies[:foo, :secure => true] = "bar"

:secure по умолчанию является ложным. Как я могу иметь файлы cookie по умолчанию, по всему общему?

Это на Rails 2.3.8

4b9b3361

Ответ 1

Спасибо @knx, ты отправил меня по правильному пути. Здесь появился обезьянник, который, кажется, работает:

class ActionController::Response
  def set_cookie_with_security(key, value)
    value = { :value => value } if Hash != value.class
    value[:secure] = true
    set_cookie_without_security(key, value)
  end
  alias_method_chain :set_cookie, :security
end

Как вы думаете?

Ответ 2

Нет необходимости в monkeypatch ActionController/ActionDispatch, а force_ssl имеет побочные эффекты (например, когда за ELB).

Самый простой способ получить безопасные файлы cookie - изменить config/initializers/session_store.rb:

MyApp::Application.config.session_store :cookie_store, key: '_my_app_session',
                                                       secure: Rails.env.production?

Ответ 3

начиная с рельсов 3.1, согласно руководству по безопасности рельсов, вы можете просто установить следующее в application.rb:

config.force_ssl = true

это заставляет cookie отправлять только по https (и я также предполагаю все остальное).

Ответ 4

Быстрое и грязное решение: я думаю, что это возможно, изменив [] = метод в куки-модуле пакета действий (actionpack/lib/action_controller/cookies.rb)

от

    def []=(name, options)
      if options.is_a?(Hash)
        options = options.inject({}) { |options, pair| options[pair.first.to_s] = pair.last; options }
        options["name"] = name.to_s
      else
        options = { "name" => name.to_s, "value" => options }
      end

      set_cookie(options)
    end

в

    def []=(name, options)
      if options.is_a?(Hash)
        options.merge!({:secure => true})
        options = options.inject({}) { |options, pair| options[pair.first.to_s] = pair.last; options }
        options["name"] = name.to_s
      else
        options = { "name" => name.to_s, "value" => options }
      end

      set_cookie(options)
    end

Ответ 5

# session only available over HTTPS
ActionController::Base.session_options[:secure] = true

Ответ 6

Вы должны посмотреть на драгоценный камень стойки-ssl-enforcer. Я просто искал чистый ответ на этот вопрос, и он решает проблему независимо от версии Rails, в которой вы находитесь, плюс ее чрезвычайно настраиваемый.