Есть ли способ, которым я могу инициировать постоянный сеанс в PHP без размещения cookie сеанса? Существуют ли другие способы поддержки сеанса на разных страницах, например, решение на основе IP-адресов?
Моей причиной для запроса является то, что, хотя у большинства пользователей есть файлы cookie, я хочу посмотреть, есть ли способ, чтобы система входа в систему работала для тех, у кого она была отключена (хотя я считаю, что отключить куки-файлы просто необязательно, паранойя, лично).
Я не думаю, что слишком много, чтобы попросить ваших пользователей включить файлы 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();
Вы можете установить значение ini-value для session.use_trans_sid
true, чтобы активировать добавление идентификатора сеанса к каждому URL-адресу. Посмотрите на это .
В целях безопасности вы должны ограничить сеанс IP-адресом, создавшим сеанс. Однако это не совсем безопасно, поскольку кто-то с одним и тем же IP (за прокси-сервером, например) может повторно использовать тот же сеанс.
Вы можете работать с идентификаторами сеанса в 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 )
Рекомендации:
Вы можете сохранить идентификатор сеанса для каждого IP-адреса в базе данных:
Создайте таблицу mysql с тремя полями: session_id, ip и уникальным временным ключом (для зарегистрированных пользователей) или любым другим условием, которое вам нравится. Затем отключите файлы cookie сеанса и use_trans_sid.
затем создайте код для управления поведением сеанса на основе этой новой таблицы!
после session_start()
сохранить session_id в таблице, а затем получить его из таблицы (по IP и любому другому условию), а затем вызвать
session_id($in_table_session_id);
для получения дополнительной информации и полного руководства см .: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe
Вы можете создать запись базы данных или временный файл и проверить $_SERVER
vars на запрос при каждой загрузке страницы. Это риск для безопасности, но с достаточным количеством переменных (см. Список здесь ) вы можете почувствовать, что у вас есть шанс захвата до приемлемого уровня; только вы знаете, насколько безопасно ваше приложение.