PHP сессии без cookies


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

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

6   51   2010-09-18 12:05:49

6 ответов:

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

в противном случае, вы можете задать свой 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-значение 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 и уникальный временный ключ (для зарегистрированных пользователей) или любое другое условие, которое вам нравится. Затем отключите сеансовые куки и use_trans_sid.

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

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

session_id($in_table_session_id);

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

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

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