2010-09-22 9 views

risposta

4

Grazie @knx, hai mandato me fare nella giusta direzione. Ecco il monkeypatch mi è venuta, che sembra funzionare:

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 

Cosa ne pensi?

+0

John, dove nell'app Rails posizioniamo la classe sopra? – Rafael

+2

in un inizializzatore –

+0

grande. grazie. un'altra cosa, io il mio sviluppatore - usando webrick - quando ho impostato il flag di sicurezza su true in environment.rb non riesco a farmi passare la schermata di login - ho notato che c'è un cookie impostato nell'app delle risposte. Qualche idea su cosa potrebbe andare? – Rafael

1

rapida e soluzione sporca: Penso che sia possibile, modificando [] = metodo in azione modulo cookie Pack (actionpack/lib/action_controller/cookies.rb)

da:

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

partire con le rotaie 3.1, secondo the rails security guide, si può semplicemente impostare il seguente nel application.rb:

config.force_ssl = true 

questo costringe il cookie da inviare tramite HTTPS solo (e presumo tutto il resto, anche).

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

questa è una nuova funzionalità in rails 4? –

+0

Non lo so. Tuttavia, in Rails 4 funziona. Puoi anche controllare questa proprietà nella TUA versione di Rails. – alsotang

+0

Questo è solo per il cookie di sessione, giusto? Non per i cookie in generale? –

27

Non c'è bisogno di monkeypatch ActionController/ActionDispatch, e force_ssl ha effetti collaterali (per esempio quando behind an ELB).

Il modo più semplice per ottenere i cookie sicuro è modificare config/initializers/session_store.rb:

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

Questa è la risposta corretta (verificato che funziona in Rails 4.2.7.1). Per testarlo facilmente, imposta 'secure: true' e poi puoi verificare che il cookie sia generato correttamente. Quindi puoi cambiarlo in 'Rails.env.production? ' – PlagueHammer

+0

sembra che questo influirà solo sul cookie di sessione. La persona richiedente ha richiesto la protezione come predefinita per tutti i cookie. Può @ david-cain verificare se quella soluzione funziona per tutti i cookie? –

0

Si dovrebbe guardare la gemma cremagliera-ssl-enforcer. Stavo solo cercando una risposta pulita a questo e risolve il problema indipendentemente dalla versione di Rails su cui ti trovi, inoltre è estremamente configurabile.

Problemi correlati