Какими способами можно идентифицировать зарегистрированного пользователя в Интернете? - PullRequest
5 голосов
/ 06 мая 2010

Вот сценарий:

Есть 5 веб-сайтов (разные доменные имена), которые должны разделить сессию. Я использую немного кода на каждом сайте, который возвращает изображение blank.gif и одновременно устанавливает сеанс (синхронизируя его с текущим сеансом). Каждый из сайтов вызывает сеанс-IMG с каждого из других сайтов. Также все сайты имеют доступ к одной и той же базе данных (где хранится сеанс). Это прекрасно работает на FF и Chrome, но не на IE (или Safari PC) ...

Мне нужен альтернативный метод для поддержания активности сессии? Приложение представляет собой небольшую настраиваемую CMS, так что на самом деле его будут использовать только 2-3 человека.

Возможно, я могу идентифицировать логины пользователей по IP, а затем продолжать проверять IP на всех сайтах ...

Есть ли что-то более гранулярное, например, компьютерный uuid, который я могу проверить?

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

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

1 голос
/ 26 ноября 2010

Если это тот же сеанс, почему бы не вы просто передаете идентификатор сеанса как Получить параметр, когда пользователь переходит от с одной страницы на другую? - @ Daff

@ Дафф, если вы добавите здесь свой ответ, я изменю его и выберу в качестве ответа

0 голосов
/ 06 мая 2010

Вы можете переопределить обработчик сеанса, чтобы он сохранял данные сеанса в базе данных, которую используют ваши разные веб-сайты. Затем вам нужно будет установить cookie-файл сеанса с одинаковым идентификатором сеанса на каждом сервере. Вам нужно будет использовать session_set_save_handler и сделать что-то подобное:

/**
 * @desc function used to open sessions
 * @param string session path
 * @param string session id
 * @return bool
 */
function xx_session_open($path, $id){
  return true;
}

/**
 * @desc used when closing a session
 * @return bool
 */
function xx_session_close(){
  return true;
}

/**
 * @desc saves session data
 * @param string session id
 * @param string session data
 * @uses xx_crypt
 * @return bool
 * @global object PDO instance
 */

function xx_session_write($id, $data){
  global $db;
  $crypted = xx_crypt($data);
  // Saves data into db
  $sql = 'REPLACE INTO sessions (`ID`, `data`, `lastUsed`, `IV`) VALUES(:id, :data, NOW(), :iv)';
  $sth = $db->prepare($sql);
  $sth->execute(array(':id'=>$id, ':data'=>$crypted[0], ':iv'=>$crypted[1]));
  return true;
}

/**
 * @desc gets session data
 * @param string session ID
 * @return string
 * @global object PDO instance
 * @uses xx_decrypt
 */
function xx_session_read($id){
  global $db;
  $sql = 'SELECT `data`, `IV` FROM sessions WHERE `ID`=:id';
  $sth = $db->prepare($sql);
  $sth->execute(array(':id'=>$id));
  list($crypted, $iv) = $sth->fetch();
  $data = xx_decrypt($crypted, $iv);
  return $data;
}

/**
 * @desc destroys a session
 * @param string session ID
 * @return bool
 * @global object PDO instance
 */
function xx_session_destroy($id){
  global $db;
  $sql = 'DELETE FROM sessions WHERE `ID`=:id';
  $sth = $db->prepare($sql);
  $sth->execute(array(':id'=>$id));
  return true;
}

/**
 * @desc delete old sessions
 * @param int session lifetime (in seconds)
 * @return bool
 * @global object PDO instance
 */
function xx_session_gc($lifetime){
  global $db;
  $sql = 'DELETE FROM sessions WHERE `lastUsed` < :limit';
  $sth = $db->prepare($sql);
  $sth->execute(array(':limit'=>date('Y-m-d H:i:s',time() - $lifetime)));
  return true;
}

// Set session handler
session_set_save_handler("xx_session_open", "xx_session_close", "xx_session_read", "xx_session_write", "xx_session_destroy", "xx_session_gc");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...