Остановка кнопки «Назад» от раскрытия защищенных страниц? - PullRequest
6 голосов
/ 11 февраля 2011

Я сталкиваюсь с (по-видимому, распространенной) проблемой с кэшем браузера, и мои защищенные страницы доступны через кнопку возврата (после выхода пользователя из системы).

Вот мой logout.php

<?php
    // 1. Find the session 
    session_start();

    // 2. Unset all the session variables
    $_SESSION = array();

    // 3. Destroy the session cookie
    if(isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time()-42000, '/');
    }

    // 4. Destroy the session
    session_destroy();

    redirect_to('index.php?logout=1');
?>

При этом пользователи успешно выходят из IE7, IE8, Chrome и Firefox, но в Safari я могу нажать кнопку «Назад» (сразу после выхода из системы) и по-прежнему видеть защищенный контент.Если я обновляю защищенную страницу, она загружает меня на экран входа в систему (как и должно быть).

Я пытался использовать:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

... но это не имеет никакого эффекта.Кто-нибудь может дать совет?Я нашел эту статью о кешировании в браузере, но я до сих пор не нашел в ней ответа ... хотя я нашел:

<?php
 Header("Cache-Control: must-revalidate");

 $offset = 60 * 60 * 24 * 3;
 $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
 Header($ExpStr);
?>

... что тоже не даетрешать проблему."Хм.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Если вы можете использовать HTTPS, то в сочетании с заголовком Cache-control: no-cache отключится «кэш страницы» (термин WebKit для кэш-памяти в памяти / обратного хода).Недостатком этого является то, что он будет отключен для всех безопасных просмотров страниц, а не только после выхода из системы.( Источник ; обратите внимание, что они работают над разрешением исключений, стоит следить за этим.)

Если вы можете зависеть от JavaScript, то добавление обработчика событий unload предотвратит "кеш страниц ".Преимущество этого также заключается в том, что вы можете разбивать кэш только при нажатии кнопки или ссылки «выйти», только затем подключая обработчик события unload.( Источник )

Ни одно из этих решений не является идеальным, но одно из них может быть полезным компромиссом.

1 голос
/ 11 февраля 2011

Это может показаться проблемой веб-набора / Safari.Об этом раньше уже спрашивали без однозначного ответа - Кнопка Safari Back не поддерживает сеанс выхода из PHP

Посмотрите на ссылки в ответе, думаю, вы найдете ответсобытие разгрузки.

0 голосов
/ 11 февраля 2011

Часть проблемы в том, что вы устанавливаете заголовок Expires в будущем.Браузеры используют заголовок Expires в качестве индикатора того, как долго что-то должно оставаться в кэше.Попробуйте это:

$ offset = 60 * 60 * 24 * 3;
$ ExpStr = "Expires:".gmdate ("D, d MYH: i: s", time () - смещение в $)."GMT";
Заголовок ($ ExpStr);

Это установит истекший заголовок в прошлом и заставит браузер каждый раз повторять запрос страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...