2012-05-24 10 views
11

Dopo aver utilizzato Devise per la mia autenticazione, ho scoperto che c'era un buco di sicurezza in quanto, dopo che l'utente si è disconnesso, le variabili di sessione sono conservate. Ciò consente a chiunque di premere il pulsante Indietro e accedere alla schermata precedente dell'utente connesso.Rails (metodo set_no_cache) Non è possibile disabilitare la memorizzazione nella cache del browser in Safari e Opera

ho guardato questi posti Num 1 Num 2 Num 3

ho aggiunto queste righe alla mia application_controller

before_filter :set_no_cache 
def set_no_cache 
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" 
response.headers["Pragma"] = "no-cache" 
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
end 

Nel _form.html.erb ho aggiunto questo al vertice

<%if user_signed_in? %> 
<%=link_to "Sign Out", destroy_user_session_path, :method => :delete %><br/> 
<%= form_for(@listing) do |f| %> 
<% if @listing.errors.any? %> 
........... 

Poi ho provato l'a pplicazione su Firefox, Chrome e Safari.

Firefox e Chrome sono stati perfetti in quanto ho disconnesso e premo il pulsante Indietro e non riuscivo a vedere la schermata precedente dell'utente, tuttavia, in Safari e Opera, il comportamento insicuro persiste. Questo codice non ha effetto.

Qualche suggerimento su come risolvere questo problema?

Grazie

+0

Questo è un duplicato di http://stackoverflow.com/questions/2866826/how-do-i-stop-opera-from-caching-a-page – hallvors

+0

hmm. Ho visto questo link. No, dove parla di Safari, menziona solo Opera. E ho provato tutte le soluzioni elencate qui come potete vedere sopra. – banditKing

+0

Ops, hai ragione su Safari. Solo la parte "Opera" della domanda è un vero duplicato, poiché la risposta spiega perché Opera si comporta in questo modo e l'unica vera soluzione è usare https e must-revalidate. – hallvors

risposta

11

Ho affrontato lo stesso problema e trovato una buona soluzione e ho bloggato a

http://www.fordevs.com/2011/10/how-to-prevent-browser-from-caching-a-page-in-rails.html

Per aggiungere 'no-cache', aggiungere le seguenti righe @ file application_controller.rb

before_filter :set_no_cache 

e la funzione

def set_no_cache 
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
end 
+0

Questo non funziona in Safari ma Chrome e Firefox lo fa. – joeyk16

1

Prima di tutto, per eventuali problemi con la cache, usano di Mark Nottingham guide on HTTP caching

Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Expires: 0 

Prova questo.

0

ho scoperto che d questo nel mio controller applicativo funzionava benissimo per lo sviluppo.

after_filter :expire_for_development 

protected 

def expire_for_development 
    expires_now if Rails.env.development? 
end