PHP сессия без куки - PullRequest
       0

PHP сессия без куки

55 голосов
/ 18 сентября 2010

Есть ли способ, с помощью которого я могу инициировать постоянный сеанс в PHP без размещения файла cookie сеанса? Существуют ли другие способы ведения сеанса на разных страницах, например решение на основе IP-адреса?

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

Ответы [ 7 ]

57 голосов
/ 18 сентября 2010

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

В противном случае вы можете установить для session.use_only_cookies значение «0», чтобы принудительно добавлять идентификатор сеанса к URL-адресам вашего php. Этот подход, однако, имеет несколько недостатков. В основном это сохранение состояния в URL, а не в заголовке Cookie. Если бы пользователь скопировал и вставил URL-адрес страницы, на которой он находился, а кто-то другой щелкнул бы по нему, они оба использовали бы один и тот же сеанс.

<?php
     ini_set("session.use_cookies", 0);
     ini_set("session.use_only_cookies", 0);
     ini_set("session.use_trans_sid", 1);
     ini_set("session.cache_limiter", "");
     session_start();
5 голосов
/ 18 сентября 2010

Можно установить значение ini-Value session.use_trans_sid в значение true, чтобы активировать добавление идентификатора сеанса к каждому URL-адресу.Взгляните на this .

. В целях безопасности вы должны ограничить сеанс IP, который создал сеанс.Однако это не совсем безопасно, так как кто-то с тем же IP-адресом (например, за прокси-сервером) может повторно использовать тот же сеанс.

3 голосов
/ 18 сентября 2010

Вы можете работать с идентификаторами сеансов в URL-адресах и отключать файлы cookie с помощью:

ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
session_start();
// IP check
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){
   session_regenerate_id();
   session_destroy();
   session_start();
}
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR'];
// session stuff

Примечание: крайне не рекомендуется использовать идентификаторы сеансов в URL-адресах.IP-адреса могут меняться, когда вы путешествуете с беспроводной картой, и прокси-серверы имеют один и тот же IP-адрес.Он легко ломается при нажатии на «старый URL» (со старым идентификатором сеанса).

Вас также может заинтересовать создание собственной функции обработки сеанса (в сочетании с базой данных).Вы игнорируете идентификатор сеанса и привязываете его к IP-адресу.(см. примеры в http://php.net/manual/en/function.session-set-save-handler.php)

Ссылки:

0 голосов
/ 17 октября 2018

Правильный ответ на этот вопрос - НЕТ. Использование любой комбинации переменных, кроме файла cookie, небезопасно.

Подумайте об этом: когда пользователь FIRST запрашивает страницу, сервер отправляет страницу вместе с уникальным значением, говорящим «HTTP не имеет состояния, сохраняйте это, чтобы я знал, что это« вы »при следующем вызове». Это означает, что этот человек в этом браузере (независимо от вкладки), работающем в то время, имеет уникальный токен.

Если и только если они успешно вошли в систему, этот токен теперь может быть привязан к сеансу на стороне сервера. Токены должны быть такими длинными и случайными, чтобы никто не мог угадать их за один раз.

Несколько браузеров могут использовать один и тот же IP-адрес. У нескольких людей может быть ТОЧНО один и тот же пользовательский агент. Cookie - единственная система хранения, которая работает.

На самом деле есть еще один способ - добавить уникальный токен к каждой отдельной ссылке на сервер , а также все вызовы AJAX, такие как ?PHPSESSID=my-unique-token-189481958 - но это неудобно для кода.

0 голосов
/ 13 июня 2018

Если бы я хотел сделать это, я бы добавил идентификатор сеанса в код HTML в качестве тега комментария и использовал и настроил код PHP для использования идентификатора сеанса, который включен в код HTML. Я думаю, что будет более уместным сделать это вместо того, чтобы делать это с IP-адресом пользователя или добавлять идентификатор сеанса в URL.

0 голосов
/ 01 августа 2016

Вы можете создать запись базы данных или временный файл и проверять $_SERVER vars по запросу при каждой загрузке страницы.Это угроза безопасности, но с достаточным количеством переменных (посмотрите на список здесь ), вы можете почувствовать, что у вас есть шанс угнать до приемлемого уровня;только вы знаете, насколько безопасным должно быть ваше приложение.

0 голосов
/ 01 августа 2016

Вы можете сохранить идентификатор сеанса для каждого IP в базе данных:

Создать таблицу mysql с тремя полями: session_id, ip и уникальным временным ключом (для зарегистрированных пользователей) или любым другим условием, которое вам нравится.Затем отключите куки сеанса и используйте use_trans_sid.

, затем создайте код для управления поведением сеанса на основе этой новой таблицы!

после session_start() сохраните session_id в таблице и позже получите его из таблицы (по IP и любым другим условиям), а затем позвоните

session_id($in_table_session_id);

для получения дополнительной информации и полного руководства см .: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

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