Для этого ответа я сделал несколько предположений:
- Пользователь должен ввести свои учетные данные хотя бы один раз в каждом домене (любой другой способ был бы серьезной проблемой безопасности)
- У вас есть доступ к базе данных или файловому пространству за пределами корневого веб-узла.
- субдомен, домен или любое другое имя будет упоминаться как "site"
- Цель состоит в том, чтобыиметь общий файл (физический файл или сериализованный в базе данных), доступный на каждом сайте / домене.
Для моего примера я буду использовать базу данных, поскольку эту идею я передаю, а не базу данных/ методы доступа к файлу, у меня будут удалены ненужные строки, IE: Как подключиться к базе данных.Если вам нужна эта концепция или кто-то еще хочет, чтобы я заполнил пробелы для полноты, просто оставьте комментарий.На с кодом.Я бы выбрал совершенно другой подход.Исходя из того, что я понял из вашего вопроса и связанного с ним поста, вы пытаетесь поделиться сеансом, используя общее имя сеанса.
- Каждый сайт имеет свой собственный идентификатор сеанса.
- Каждый сайт имеет свой собственный файл cookie аутентификации ($ _COOKIE ['userid'] или $ _COOKIE ['userhash']).
- Создаются отдельные сеансы, и на каждом сайте сохраняется общий файл cookie.
- Используя собственный обработчик сеансов, каждый сайт считывает одни и те же данные.
class MySessionHandler implements SessionHandlerInterface
- Мое запоздалая мысль была еще более простым подходом, классом, который действует как обработчик сессии, читая / записывая в общий файл.Так как обработчик сессии php не сохраняет данные, пока скрипт не завершится.
Оригинальная идея - не буду вдаваться в подробности, это просто для справки.
class MySessionHandler implements SessionHandlerInterface {
private $savePath;
public function read($id) {
$id = some_user_authentication_function();
$hash = $_COOKIE['_h'];
$result = mysql_query("SELECT sess_data FROM login_table WHERE user_id = {$id} AND hash = {$hash}");
return $result['sess_data'];
}
public function write($id, $data) {
$id = some_user_authentication_function();
$hash = $_COOKIE['_h'];
$result = mysql_query("UPDATE login_table SET sess_data = {$data} WHERE user_id = {$id} AND hash = {$hash}");
return ($result === false) ? false : true;
}
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
class customSessionHandler
{
private $hash;
private $id;
private $sess_db;
public function __construct($db) {
$this->hash = $_COOKIE['hash'];
$this->id = some_user_authentication_function($this->hash);
$this->sess_db = $db;
}
public function get($key) {
$query =
"SELECT value ".
"FROM ".$this->sess_db.
"WHERE user_id = {$id} ".
" AND hash = {$hash} ".
" AND key = {$key}";
$result = mysql_query($query);
return $result['key'];
}
public function set($key, $val) {
$query =
"REPLACE INTO ".$this->sess_db.
"SET {$key} = {$val} ".
"WHERE user_id = {$id} ".
" AND hash = {$hash}";
return (mysql_query($query) === false) ? false : true;
}
}
$handler = new customSessionHandler('sess_data');
session_start();
Как указывалось в начале, любой код, который не важен для объяснения концепции, был удален.Вещи, которые могут быть не очевидны для всех: - $ key и $ val необходимо очистить перед отправкой в базу данных.(предотвращение атак с использованием инъекций) - хэш отправляется вашим функциям входа в систему, поэтому при необходимости хэш может использоваться для очистки данных сеанса, а также может использоваться для аутентификации пользователя.- mysql подготовленные операторы были бы идеальными здесь, так что вы можете подготовить два запроса в конструкторе, а затем просто повторно использовать оператор при каждом вызове.Затем поместите код закрытия соединения в деструктор.
После размышлений Было бы гораздо больше безопасности, если бы у каждого сайта был свой хэш.Затем, если вы обнаружите аномалию безопасности, вы можете просто заблокировать или повторно запросить учетные данные с одного сайта, не ставя под угрозу хэш для сети сайтов.Для реализации этого было бы так же просто, как создать другую таблицу, содержащую: - user_id - site_name (example.com) - hash - timeout - повторно подтвердить подлинность
и изменить таблицу session_data, поэтому вместо доступа к ключу $=> пара $ val по хешу, доступ к нему осуществляется по user_id.Спасибо за чтение, надеюсь, это кому-нибудь пригодится.