Как предотвратить переход пользователя обратно, на защищенную страницу, после того как он разлогинился?

Сразу скажу, что я не думаю, что решение этой проблемы зависит от того, на чем реализована серверная часть(Ruby, Python, PHP, JSP, ASP.NET, etc.), поэтому я опускаю тут этот момент.

В общем допустим, что пользователь в данный момент залогинен и находится в своем профайле(profile.htm). Далее он решает разлогиниться и нажимает на соответствующую ссылку(logout.htm). logout.htm удаляет куки из браузера, объекты связанные с юзером на сервере и редиректит его на страницу login.htm. Но вот вопрос: как предотвратить переход пользователя обратно, на profile.htm, если он(или кто-то другой) нажмет кнопку «Go Back» в браузере?
Браузер кеширует страницу профайла и предыдущие тоже, что позволяет нажатием «Go Back» просмотреть их все по цепочке… Все ссылки на этих страницах будут, конечно же, уже не активны, но кешированные данные о пользователе(допустим: email, name etc.) можно увидеть.

Как предотвратить такое поведение системы?
Я имею ввиду стандартные способы, не хочется изобретать велосипед.


UPD: Короче говоря, какого-то законченного решения проблемы я так и не нашел.

Трюки с ajax, на мой взгляд, в принципе не могут тут применяться потому, что это больше похоже на хак, нежели на стандартную реализацию и это не будет работать при выключенном javascript. Так же, такое решение больше годится для порталов большей частью или полностью построенных на ajax (вроде Twitter).

Другое решение на javascript, с использованием history.forward(), работает не везде. Например, в последней версии Firefox(Firefox4) — это не работает. Также, при выключенном javascript…

С точки зрения реализации более правильный способ тот, что предлагает VolCh: добавление http-заголовков, вроде Cache-Control:no-cache, no-store, must-revalidate; Pragma:no-cache; Expired:0. Ведь лучше просто не закидывать браузеру в кеш то, что после logout захочется оттуда удалить. Это логичный и простой способ достичь указанной мной цели. Хабр, кстати, тоже после логина возвращает заголовки с этими аттрибутами. Однако, этот подход так же работает не везде. Я протестировал на Firefox, Chrome, Opera и Safari. В первых двух случаях браузер ожидаемо не позволял переходить назад после logout, во вторых двух — позволял…

В общем, на данный момент я останавливаюсь на способе с http-заголовками.

PS: Кстати, очень полезной оказалась вот эта ссылка:
stackoverflow.com/questions/4194207/restrict-user-from-accessing-the-previous-page-after-signout
  • Вопрос задан
  • 5686 просмотров
Пригласить эксперта
Ответы на вопрос 8
Hast
@Hast
Да, в общем-то, никак. Только я, например, не понимаю для чего это нужно. Если пользователь уже и так был на этой странице, какой смысл скрывать её от него после логаута?
Ответ написан
vinxru
@vinxru
Сделать пустую страницу, которая делает AJAX запрос и выводит результат на экран (в innerHTML).
Серверный код (почти наверняка) даже не придется менять.
При нажатии на «назад», страница сделает повторный AJAX запрос, но данных уже не получит.
Ответ написан
Комментировать
printf
@printf
Ем детей.
Отправляйте HTTP-заголовок Vary: Cookie. Это стандартный способ отдавать разные страницы при потере сессии, странно что никто еще не написал.

Реализация этого зависит от браузера, конечно.
Ответ написан
Комментировать
Хм… нестандартно и костыльно. На profile.htm разместить JS проверяющий наличие кукисов, кукисов нет — делаем редирект или еще что куда надо.
Ответ написан
@himik
а какой браузер так себя ведет? попробовал в хроме на нескольких сайтах, в том числе и на здесь, не получилось вернуться в личный кабинет после логаута.
Ответ написан
Запретить кэширование браузеру различными http заголовками типа Cache-Control, Expires, Pragma: no-cache.

Правда есть браузеры, которым плевать на стандарты и запреты. И это даже не IE, а Opera (если ничего не изменилось за последнее время)
Ответ написан
iStyx
@iStyx
Подсказка: страницы, полученные по https, не кэшируются браузерами
Ответ написан
Можно сделать изощрённо: все страницы отдавать в зашифрованном виде(и пусть оно кэшируется), плюс на странице скрипт. Этот скрипт делает ajax запрос, который получает ключ(который выдаётся на сессию) и пытается расшифровать страницу и отобразить что получилось. Если не получилось, то обновляем текущую страницу. Так будет каждый раз выполняться запрос, но достаточно простой, а основная часть страницы будет закэширована браузером.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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