безопасные сеансы / файлы cookie в php

У меня вопрос о сеансах. Как сделать безопасный сеанс входа в систему / cookie. Я рассматривал этот пример, когда они добавляют этот массив к сеансу:

$data = array{ username = $_POST['username']; is_logged = true; } 

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

Или это абсолютно безопасно, и я чего-то не хватает?

Кроме того, что вы, ребята, думаете о хранении сессий в БД? Я знаю, что у CI есть встроенная функция для этого. Означает ли это какие-либо проблемы, связанные с производительностью, или стоит ли это делать?

Solutions Collecting From Web of "безопасные сеансы / файлы cookie в php"

Я считаю, что вы не понимаете, как должен работать 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 (я позабочусь о деталях альтернативного синтаксиса)
  • предотвращать захват сеанса (т. е. кто-то другой, притворяющий существующий сеанс), хранить в $ _SESSION то, что идентифицирует браузер, – общий шаблон заключается в том, чтобы сохранить 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, но это значение не имеет для него значения, поскольку он не может выводить из него какую-либо информацию, а отправка случайных идентификаторов сеансов имеет очень мало шансов на успех.