Подтвердить что ты не робот

PHP-сессия без файлов cookie

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

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

4b9b3361

Ответ 1

Я не думаю, что это слишком много, чтобы попросить ваших пользователей включить файлы 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();

Ответ 2

Вы можете работать с идентификаторами сеанса в 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)

Литература:

Ответ 3

Вы можете установить значение ini-value session.use_trans_sid в true, чтобы активировать добавление идентификатора сеанса к каждому URL-адресу. Посмотрите это.

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

Ответ 4

Вы можете сохранить идентификатор сеанса для каждого 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

Ответ 5

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