Какой смысл отключать cookie во время выхода из сессии php? - PullRequest
3 голосов
/ 03 августа 2011

Я разрабатываю веб-приложение на PHP, где пользователь сможет иметь свою учетную запись, а сеанс, который отслеживает пользователя, хранится в базе данных MySQL. Теперь, после поиска ответа о том, как это реализовать, я обнаружил, что многим нравится использовать session_destroy() и отключить cookie. Почему - не будет достаточно session_destroy () само по себе? Даже руководство по PHP гласит: «Чтобы полностью завершить сеанс, например, выйти из системы, идентификатор сеанса также должен быть не установлен».

Мои рассуждения: после того, как пользователь вышел из системы и случайно посетил еще одну страницу на вашем сайте, PHP-скрипт, проверяющий, вошел ли пользователь в систему или нет, вызовет session_start (), установив новый файл cookie сеанса. в любом случае для пользователя. Вот как это может выглядеть:

// here we include some scripts and make some instances we'll need
require_once("database.php");
require_once("session.php");
$database_connection = new DB_Connection();
$session = new Session($database_connection);

// here a session cookie is sent to a user, even if he or she isn't logged in
session_start();

// finally we check if the user is logged in
$log_isLogged = false;
if(isset($_SESSION['member_id'], $_SESSION['username'])){
    $log_member_id = $_SESSION['member_id'];
    $log_username = $_SESSION['username'];
    $log_isLogged = true;
}

Конечно, хорошо, когда пользователь знает об этом факте и покидает сайт до того, как может быть установлен новый файл cookie. Но некоторые сайты даже перенаправляют вас на новую страницу сразу после выхода из системы, что приводит к созданию нового файла cookie сеанса - отменяя то, что вы только что сделали.

Являются ли мои рассуждения в некотором роде ошибочными, или это действительно не имеет значения, если вы сбросили куки сеанса или нет? Может быть, большинство разработчиков просто считают, что сбросить его, по крайней мере, не помешает?

Я не являюсь носителем языка, поэтому заранее прошу прощения за любые опечатки и грамматические ошибки.

1 Ответ

7 голосов
/ 03 августа 2011

(Плохо названная) функция session_destroy() удаляет только данные вне сеанса. Он не удаляет cookie сеанса из браузера и оставляет идентификатор_ сеанса, связанный с сеансом. session_start() выдает новый session_id клиенту, только если он не был указан в запросе клиента. Ваш код уязвим к атаке, известной как фиксация сеанса , когда злоумышленник запускает сеанс на вашем сайте, чтобы получить действительный идентификатор_сессии, а затем обманывает ничего не подозревающих пользователей вашего сайта, чтобы войти в систему с известным сессионным идентификатором атакующего. , Это может быть достигнуто либо путем отправки жертве ссылки с идентификатором session_id в URL (если ваш сайт примет это таким образом), либо различными другими способами. Как только жертва входит в систему, злоумышленник также эффективно входит в систему как тот же пользователь.

Чтобы предотвратить атаки с фиксацией сессии, необходимо:

  1. При успешном входе в систему выдать клиенту новый session_id, позвонив по номеру session_regenerate_id().

  2. При выходе из системы полностью уничтожьте каждый артефакт сеанса как на сервере, так и на клиенте. Это означает, что необходимо session_destroy() и сбросить файл cookie клиента с помощью setcookie().

  3. Убедитесь, что ваш сайт никогда не отображает session_id в URL-адресе, или не принимайте session_id, указанный в URL-адресе.

  4. Убедитесь, что ваши session_ids достаточно длинные и случайные, чтобы они не могли быть практически угаданы злоумышленником.

  5. Убедитесь, что ваш сайт не уязвим для межсайтовых скриптов атак, которые позволят злоумышленникам украсть действительные session_ids у уже вошедших в систему пользователей.

  6. Убедитесь, что ваш логин происходит через https и cookie-файл сеанса помечен как безопасный. Все общение, связанное с сессиями, должно происходить через https. Идентификатор сеанса клиента никогда не должен передаваться по протоколу http, поскольку это может привести к его открытию во время транзита.

Дополнительная ссылка: Первая десятка страниц OWASP по управлению сессиями

...