2010-09-22 6 views

Respuesta

4

Gracias @knx, me enviaron a hacer en el camino correcto. Aquí está la monkeypatch me ocurrió, que parece estar funcionando:

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 

¿Qué opinas?

+0

John, donde en la aplicación de Rails colocamos la clase de arriba? – Rafael

+2

en un inicializador –

+0

genial. gracias. una cosa más, mi entorno de desarrollo - usando webrick - cuando establezco el indicador de seguridad como verdadero en environment.rb no puedo pasar mi pantalla de inicio de sesión - noté que hay una cookie establecida desde la aplicación en las respuestas. ¿Alguna idea de lo que podría ser uno? – Rafael

1

Solución rápida y sucia: Creo que es posible mediante la modificación [] = método en acción módulo de galletas de carga (actionpack/lib/action_controller/cookies.rb)

de:

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 

a:

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 
14

empezando por los carriles 3,1, de acuerdo con the rails security guide, sólo tiene que establecer lo siguiente en su application.rb:

config.force_ssl = true 

Esto obliga a la cookie que se enviará a través de HTTPS solamente (y supongo que todo lo demás, también).

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

¿es esta una nueva característica en los rieles 4? –

+0

No lo sé. Sin embargo, en Rails 4 funciona. También puede verificar esta propiedad en SU ​​versión de Rails. – alsotang

+0

Esto es solo para la cookie de sesión, ¿verdad? No para cookies en general? –

27

no hay necesidad de monkeypatch ActionController/ActionDispatch, y force_ssl tiene efectos secundarios (por ejemplo, cuando behind an ELB).

La forma más sencilla de conseguir las galletas seguras es modificar config/initializers/session_store.rb:

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

Esta es la respuesta correcta (verificó que esto funciona en Rails 4.2.7.1). Para probar esto fácilmente, configure 'secure: true' y luego puede verificar que la cookie se haya generado correctamente. Entonces puede volver a cambiarlo a 'Rails.env.production?' – PlagueHammer

+0

, parece que esto solo afectará a la cookie de sesión. La persona que realizó la solicitud solicitó seguridad como valor predeterminado para todas las cookies. ¿Puede @ david-cain verificar si esa solución funciona para todas las cookies? –

0

Usted debe mirar la gema rack ssl-ejecutor. Solo estaba buscando una respuesta clara a esto y resuelve el problema independientemente de la versión de Rails en la que esté, además de que es extremadamente configurable.

Cuestiones relacionadas