безопасные сессии / куки в php - PullRequest
2 голосов
/ 04 сентября 2010

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

$data = array{

    username = $_POST['username'];
    is_logged = true;

}

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

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

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

Ответы [ 2 ]

10 голосов
/ 04 сентября 2010

Я полагаю, вы не понимаете, как сессия 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;
0 голосов
/ 04 сентября 2010

Да, это действительно небезопасный метод, и его не следует нигде использовать, если вы хотите предотвратить перехват сеанса.

Более надежный метод будет генерировать уникальный идентификатор сеанса (например, хеш) дляпользователь, когда она входит в систему и связывает сеанс с этим идентификатором на стороне сервера.Затем отправьте ТОЛЬКО этот идентификатор сеанса в куки обратно клиенту.Когда клиент отправляет запрос с cookie, вы захватываете идентификатор сеанса и восстанавливаете имя пользователя и любую другую информацию, связанную с ним, для обработки вашего запроса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...