пользователь может снова войти в IE после выхода из системы, нажав кнопку «Назад»

Я использую скрипт входа в систему PHP, который запрашивает у пользователя имя пользователя и пароль.

После аутентификации программа сохраняет значение сеанса. При выходе из системы значение сеанса устанавливается пустым.

Вот проблема:

В IE 8 (не Firefox) пользователь может несколько раз нажать кнопку «Назад», пока не появится экран с сообщением «Срок действия веб-страницы истек». Вероятно, это экран входа в систему.

Если он нажимает F5, похоже, что имя пользователя и пароль все еще висят в переменных POST, и он снова входит в систему.


person TMP file guy    schedule 27.07.2010    source источник


Ответы (3)


Похоже, вы на самом деле не удаляете сеанс на сервере, а очищаете идентификатор сеанса в URL-адресе (или что-то в этом роде) на клиенте. Поэтому, когда нажата кнопка «Назад», он пытается повторно отправить идентификатор сеанса, и ваш сервер принимает его.

OR

Страницы просто кешируются клиентом, и когда они возвращаются, он загружается из кеша. Когда они принудительно обновляют, он перезагружает страницу без переменных.

person Mitch Dempsey    schedule 27.07.2010
comment
Нет идентификатора сеанса в URL. Я думаю, что страница входа кэшируется со значениями. Когда они нажимают F5, он повторно отправляет имя пользователя и пароль. У меня есть этот набор в заголовке: заголовок (Cache-Control: no-cache, must-revalidate); header (Срок действия: сб, 26 июля 1997 г., 05:00:00 по Гринвичу); заголовок (Прагма: общедоступный); сеанс_старт(); - person TMP file guy; 28.07.2010
comment
Это возможно, но обычно я думаю, что браузер выдаст предупреждение: вы повторно отправляете переменные формы или что-то в этом роде. - person Mitch Dempsey; 28.07.2010

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

person Jonathan Park    schedule 27.07.2010

после того, как вы опубликуете форму входа и подтвердите/войдёте/все, выполните header('location:someOtherPage.php) перенаправление на другую страницу. Тогда форму нельзя будет повторно опубликовать по нажатию f5. Например:

//login.php
<?php
//no cache headers if you want.
session_start();
if(isset($_POST) && !empty($_POST)){
    //validate user & pass. if valid set session then...
    if(is_valid_user()){
        //set session
        $_SESSION['loggedIn'] = true;
        //close session. this prevents problems with vars not
        //setting when using a header redirect because you redirect
        //before the session file can write.
        session_write_close();
        //redirect to another page
        header('location:loggedIn.php');
        //stop the script from running
        exit;
    } else {
        echo "<div class='error'>Login failed.</div>";
    } 
}
//echo login form.

?>

перенаправление заголовка не отображается в истории, поэтому при нажатии назад они не увидят страницу, которая позволяет вам повторно опубликовать форму.

person Jonathan Kuhn    schedule 27.07.2010