Вопрос по ruby-on-rails, ruby – Rails (метод set_no_cache) Невозможно отключить кэширование браузера в Safari и Opera

11

После использования Devise для моей аутентификации я обнаружил, что в безопасности есть дыра в том, что после выхода пользователя переменные сессии сохраняются. Это позволяет любому человеку нажимать кнопку "Назад" и получать доступ к предыдущему экрану зарегистрированного пользователя.

Я посмотрел на эти посты № 1 № 2 № 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 небезопасное поведение сохраняется. Этот код не имеет эффекта.

Любые предложения о том, как это исправить?

Спасибо

ОК, большое спасибо. Мне удалось решить проблему Safari. но для оперы я отмечу ваши предложения. Большое спасибо :) banditKing
Это дубликатstackoverflow.com/questions/2866826/… hallvors
хмм. Посмотрел по этой ссылке. Нет, где говорится о Safari, там упоминается только Opera. И я попробовал все решения, которые они перечислили там, как вы можете видеть выше. banditKing
кто-нибудь знает как это сделать в рельсах 3.2.20?stackoverflow.com/questions/26994714/… equivalent8
Упс, вы правы насчет Safari. Только "Опера" часть вопроса - настоящий дубликат, поскольку ответ там объясняет, почему Opera ведет себя так и что единственный реальный обходной путь - это использовать https и must-revalidate. hallvors

Ваш Ответ

3   ответа
0

Я обнаружил, что выполнение этого в моем контроллере приложений отлично работает для разработки.

after_filter  :expire_for_development

protected

def expire_for_development
  expires_now if Rails.env.development?
end
11

Я столкнулся с той же проблемой и нашел хорошее решение, и я написал это в

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

Чтобы добавить & # x2018; no-cache & # x2019;, добавьте следующие строки @ файл 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
Это не работает в Safari, но в Chrome и Firefox это работает.
1

Прежде всего, для любых проблем с кешем используйте Mark Nottingham'sруководство по HTTP-кешированию

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

Попробуй это.

Похожие вопросы