Я полагаю, вы не понимаете, как сессия PHP должна работать. Вы можете безопасно хранить имя пользователя, статус входа и другие данные в массиве $_SESSION
, так как он хранится на сервере. Единственное, что отправляется в браузер, - это один файл cookie (с именем PHPSESSID, если вы не изменили его в php.ini
), содержащий идентификатор сеанса - уникальное случайное число.
Когда у вашего посетителя активная сессия каждый раз, когда он запрашивает страницу с session_start()
вверху, session_start()
будет проверять запрос на файл cookie с именем PHPSESSID, прочитайте файл сеанса на стороне сервера (если сеанс существует и является действительным) и восстановить массив $_SESSION
. Этот массив никогда не должен покидать сервер.
Сеансовый cookie устанавливается без даты истечения срока действия (если только вы не возитесь с опцией session.cookie_lifetime
в php.ini), поэтому браузер удаляет его при завершении работы. Файл сеанса на сервере имеет сам срок действия, управляемый session.gc_maxlifetime
(в секундах).
Путь к безопасным сеансам:
- убедитесь, что только куки используются для передачи идентификатора сеанса в настройку браузера
session.use_cookies=1
, session.use_only_cookies = 1
, session.use_trans_id = 0
(я избавлю вас от деталей альтернативного синтаксиса)
- предотвращение перехвата сеанса (т. Е. Кто-то другой подделывает существующий сеанс), сохраняя в $ _SESSION что-то, что идентифицирует браузер - общий шаблон - хранить
md5()
заголовка User-Agent браузера, заголовка Accept, удаленного IP адрес или их комбинация; проверять, совпадает ли оно при каждом новом запросе с существующим идентификатором сеанса
- если вы находитесь на общем сервере, вы действительно должны хранить свои файлы сеансов отдельно от файлов ваших соседей по серверу: установите
session.save_path
в папку, к которой есть доступ только у вас и PHP.
Наконец, вы должны создать скрипт для выхода пользователей из сеанса (и поощрять их использовать его вместо простой навигации). Это пример сценария:
<?php
session_start();
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
session_regenerate_id(true);
session_destroy();
session_write_close();
header('Location: your_login_page.php');
exit;