У меня вопрос о сеансах. Как сделать безопасный сеанс входа в систему / cookie. Я рассматривал этот пример, когда они добавляют этот массив к сеансу:
$data = array{ username = $_POST['username']; is_logged = true; }
Мне было интересно, достаточно ли этого? Невозможно ли изменить имя пользователя в файле cookie кому угодно или кому угодно? Что было бы хорошим путем?
Или это абсолютно безопасно, и я чего-то не хватает?
Кроме того, что вы, ребята, думаете о хранении сессий в БД? Я знаю, что у CI есть встроенная функция для этого. Означает ли это какие-либо проблемы, связанные с производительностью, или стоит ли это делать?
Я считаю, что вы не понимаете, как должен работать PHP-сеанс. Вы можете безопасно хранить имя пользователя, статус входа и другие вещи в массив $_SESSION
, так как это хранится на сервере. Единственное, что отправлено в браузер, это один куки-файл (с именем 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
(я позабочусь о деталях альтернативного синтаксиса) md5()
заголовка User-Agent браузера, заголовок Accept, удаленный IP-адрес или их сочетание; проверьте, соответствует ли он каждому новому запросу с существующим идентификатором сеанса session.save_path
в папку, к которой вы имеете доступ только с PHP и 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;
Да, это действительно небезопасный метод, и его нельзя использовать нигде, если вы хотите предотвратить захват сеанса.
Более надежный метод будет генерировать уникальный идентификатор сеанса (например, хэш) для пользователя, когда он войдет в систему, и связать сеанс с этим ID-сервером. Затем отправьте ТОЛЬКО этот идентификатор сеанса в файл cookie обратно клиенту. Когда клиент отправляет запрос в файл cookie, вы получаете идентификатор сеанса и восстанавливаете имя пользователя и любую другую связанную с ним информацию для обработки запроса.
Клиент имеет доступ к идентификатору сеанса в файле cookie, но это значение не имеет для него значения, поскольку он не может выводить из него какую-либо информацию, а отправка случайных идентификаторов сеансов имеет очень мало шансов на успех.