Rails (метод set_no_cache) Невозможно отключить кеширование браузера в Safari и Opera
После использования Devise для моей проверки подлинности я обнаружил, что в этом случае есть дыра в безопасности, после того как пользователь выходит из системы, переменные сеанса сохраняются. Это позволяет кому-либо нажать кнопку "Назад" и получить доступ к предыдущему экрану входа в систему.
Я просмотрел эти сообщения
Номер 1
Num 2
Num 3
Я добавил эти строки в свой 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
В _form.html.erb я добавил это вверху
<%if user_signed_in? %>
<%=link_to "Sign Out", destroy_user_session_path, :method => :delete %><br/>
<%= form_for(@listing) do |f| %>
<% if @listing.errors.any? %>
...........
Затем я протестировал приложение на Firefox, Chrome и Safari.
Firefox и Chrome были в порядке, когда я вышел из системы и нажал кнопку "Назад" и не смог увидеть предыдущий экран пользователя, однако в Safari и Opera небезопасное поведение сохраняется. Этот код не влияет.
Какие-нибудь предложения по устранению этого?
Спасибо
Ответы
Ответ 1
Я столкнулся с одной и той же проблемой и нашел хорошее решение, и я отправил его в блог
http://www.fordevs.com/2011/10/how-to-prevent-browser-from-caching-a-page-in-rails.html
Чтобы добавить 'no-cache, добавьте следующие строки @файл application_controller.rb
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
Ответ 2
Прежде всего, для любых проблем с кешем используйте Mark Nottingham руководство по кешированию HTTP
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Попробуйте это.
Ответ 3
Я обнаружил, что выполнение этого в моем прикладном контроллере отлично подойдет для разработки.
after_filter :expire_for_development
protected
def expire_for_development
expires_now if Rails.env.development?
end