Как сделать куки безопасными (только для https) по умолчанию в рельсах? - PullRequest
32 голосов
/ 23 сентября 2010

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

cookies[:foo] = "bar"

И укажите, что флажок «secure» (только для https) включен следующим образом:

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

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

Это на Rails 2.3.8

Ответы [ 7 ]

38 голосов
/ 06 июля 2015

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

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

MyApp::Application.config.session_store :cookie_store, key: '_my_app_session',
                                                       secure: Rails.env.production?
16 голосов
/ 21 сентября 2013

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

config.force_ssl = true

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

4 голосов
/ 23 сентября 2010

Спасибо @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

Что вы думаете?

1 голос
/ 02 января 2019

Чтобы включить SSL и включить безопасный cookie для всего приложения Ruby on Rails, включите force_ssl в файле среды, например production.rb.

# config/environments/production.rb
config.force_ssl = true

Есливам необходимо поддерживать трафик HTTP и HTTPS с вашим приложением Ruby on Rails, установите флаг безопасного cookie для своего приложения, чтобы сеансовые куки отправлялись ТОЛЬКО по HTTPS.

В результате вы больше не можете поддерживатьсостояние сеанса по HTTP, но вы, по крайней мере, защищаете себя от атак перехвата сеанса.

# config/initializers/session_store.rb
# set secure: true, optionally only do this for certain Rails environments (e.g., Staging / Production
Rails.application.config.session_store :cookie_store, key: '_testapp_session', secure: true

Здесь - это видеоурок того же самого.

1 голос
/ 20 ноября 2013
# session only available over HTTPS
ActionController::Base.session_options[:secure] = true
1 голос
/ 23 сентября 2010

Быстрое и грязное решение: я думаю, что это возможно, изменив метод [] = в модуле cookie пакета действий (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
0 голосов
/ 17 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...