Как создать уникальный идентификатор сеанса в php

На наших веб-сайтах мы хотим, чтобы вы могли обмениваться сессиями с несколькими доменами. Все эти веб-сайты находятся на одном сервере, но некоторые из них имеют другой IP-адрес.

Возможное решение, которое я нашел, это установить идентификатор сеанса:

<?php session_id($someUniqueHash); ?> 

И это работает, если я делаю хэш как md5 ('test'). В другом домене на том же сервере у нас снова сеанс.

Проблема заключается в генерации идентификатора. Я вижу некоторые решения в Интернете с microtime и т. Д., Но когда я использую этот подход, я не могу предсказать идентификатор сеанса на другой странице домена / PHP.

У кого-нибудь есть идея? Или мы не должны это реализовать? Существуют ли другие варианты совместного использования сеанса над несколькими доменами? (НЕ поддомены!)

Я достиг этой системы, используя поток типа OAuth, но мы заменили Потребителя на пользователя.

Таким образом, каждый домен будет иметь аутентифицированный Access_Token в своей собственной сессии. Затем вы будете использовать этот Access_Token для получения информации об пользователе из api.

Я также решил проблему сеанса с помощью session_set_save_handler и хранения сеансов в таблице базы данных … В этой таблице также был бы Access_Token, что упростило бы поиск сеанса с помощью DB Query.

Надеюсь, это поможет с идеями.

Хм, это сложно.

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

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

Вы можете через ссылку на вашей странице с одного домена передать идентификатор сеанса в следующий домен через $ _GET или $ _POST. Это не будет работать, если пользователь напрямую войдет в ваш другой сайт.

Единственный частично (без надежного) метода, который я могу придумать, состоит в том, чтобы вести учетную запись пользовательского компаньона в БД и использовать это, чтобы понять, к чему привязана его сессия. Таким образом, вы размещаете IP-адрес компьютеров и, возможно, какие-то другие детали, и это относится к сеансу.

IP-адрес и другие данные персонального компьютера будут записывать их в другой домен.

Возможно, это не вариант для вас, но вы можете попробовать это.

На вашем основном сайте вы генерируете идентификатор сеанса в соответствии с нормальным и увековечиваете сеанс в другом домене, в который вы можете включить теги изображений с идентификатором сеанса в URL. В ответ другой домен установит файл cookie, так что, когда посетитель придет туда, он уже знает идентификатор сеанса.

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

О, btw, принятие сеанса (принятие идентификатора с помощью параметров запроса и установка файла cookie) является деликатной составляющей и должно быть защищено, то есть сеанс должен существовать до установки cookie.

Настройте каждый сайт индивидуально:

 <?php $cfgsession['file'] = "../sessions_global.txt"; $cfgsession['keepalive'] = 7200; ?> 

Чтобы сделать несколько сеансов обмена сайтами, пусть они используют один и тот же $cfgsession['file'] . Включите сеанс с одного сайта в запросе в другой домен (возможно, по рекомендации Джека) и до тех пор, пока вы не поймаете их, сделав их запрос в другом браузере или что- то в этом роде (пожалуйста, сделайте что-нибудь, чтобы препятствовать захвату сеанса), позвольте им укажите сеанс с $ _GET. Например:

 include ("../session.php"); if (isset($_COOKIE['session'])) session_begin($_COOKIE['session'], $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); else session_begin("", $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); setcookie("session", session_identity(), 0); 

А затем просто сверните свои собственные функции session_:

 <?php function session_begin($mysession = "", $key = "", $client = "") { global $cfgsession; if (!preg_match("/^[a-z0-9]{32}$/i", $mysession)) $mysession = md5(microtime()); $error = false; $client = trim($client); $key = trim($key); $cfgsession['returning'] = false; if ($chandle = @tmpfile()) { if ($shandle = @fopen($cfgsession['file'], "rb")) { flock($shandle, LOCK_SH); fputs($chandle, $mysession . " " . time() . " $" . $client . " $" . $key . "\n"); while (!feof($shandle)) { $sline = explode(" ", trim(fgets($shandle)), 4); if ($sline[1] >= (time() - $cfgsession['keepalive'])) { if (($sline[0] == $mysession) && ($sline[3] == "$" . $key)) { $cfgsession['client'] = substr($sline[2], 1); $cfgsession['returning'] = true; } elseif (count($sline) > 2) fputs($chandle, implode(" ", $sline) . "\n"); } } fclose($shandle); fseek($chandle, 0); if ($shandle = @fopen($cfgsession['file'], "cb")) { if (flock($shandle, LOCK_EX)) { ftruncate($shandle, 0); $cfgsession['count'] = 0; while (!feof($chandle)) { $cline = trim(fgets($chandle)); fputs($shandle, $cline . "\n"); $cfgsession['count']++; } } else $error = true; fclose($shandle); } else $error = true; } else $error = true; fclose($chandle); } else $error = true; if (($cfgsession['returning'] == false) && ($mysession == $cfgsession['session'])) { $cfgsession['returning'] = true; $mysession = md5(microtime()); } $cfgsession['session'] = $mysession; if ($error) return -1; else return 0; } function session_count() { global $cfgsession; return $cfgsession['count']; } function session_client() { global $cfgsession; return $cfgsession['client']; } function session_id() { global $cfgsession; return $cfgsession['session']; } function session_index() { global $cfgsession; $index_return = array(); if ($uhandle = @fopen($cfgsession['file'], "rb")) { flock($uhandle, LOCK_SH); while (!feof($uhandle)) { $uline = explode(" ", trim(fgets($uhandle)), 4); foreach ($uline as &$value) { if ($value[0] == "$") $value = substr($value, 1); } if (count($uline) >= 2) $index_return[] = $uline; } fclose($uhandle); } return $index_return; } function session_returning() { global $cfgsession; return $cfgsession['returning']; } ?>