Как я могу сделать cookie безопасным (только https-only) по умолчанию в rails?
В контроллере Rails я могу настроить файл cookie следующим образом:
cookies[:foo] = "bar"
И укажите, что флаг "secure" (https-only) должен быть следующим:
cookies[:foo, :secure => true] = "bar"
:secure
по умолчанию является ложным. Как я могу иметь файлы cookie по умолчанию, по всему общему?
Это на Rails 2.3.8
Ответы
Ответ 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, в которой вы находитесь, плюс ее чрезвычайно настраиваемый.