Перекрестные сессии доменов - совместно использованная корзина пересекает домены

мы решаем проблему с eshop (php, mysql). Клиент хочет иметь тот же eshop на двух доменах с общей корзиной. В магазине клиент может ходить по магазинам без пользовательской учетной записи (не может быть зарегистрирован). И существует проблема, как заставить общую корзину пересечь домен.

Данные из корзины хранятся на сессиях, которые мы сохранили в базе данных также. Но мы не можем решить проблему в переносе данных по доменам. Идентификация незарегистрированного пользователя не прочна (исследование).

Пример, как это должно работать

Клиент переходит к domainOne, и добавьте некоторые вещи в корзину. Чем он переходит к domainTwo (ссылкой, вводя доменный адрес, однако), и добавьте некоторые другие вещи в корзину. В корзине у него есть вещи от обоих доменов (после обновления страницы).

У Вас есть какая-либо идея, как решить эту проблему?

Что не работало:

  • перенаправление не возможно из-за клиента requirments
  • cookie связаны с доменом
  • set_cookie с другим доменом не работал
  • simpliest путь состоит в том, чтобы перенести только sessionid (сохраненный в cookie), но мы не знаем, как к wholeproof идентифицируют незарегистрированных пользователей.
  • есть ли какое-либо другое место, где данные могут храниться на стороне клиента кроме cookie? (вероятно, не)
  • мы не можем использовать отправку sessionid параметрическими усилителями в URL (если пользовательский щелчок для соединения с другим доменом) или разрешение ссылающегося домена заголовка, bcs мы не знаем, как пользователь может достигнуть другого домена.

Если Вы не можете понять меня, возьмите меня вопрос. Если Вы думаете, это имеющее eshop на двух доменах с общей (общей) корзиной является плохой идеей, не говорите мне, мы знаем это.

Спасибо за каждый ответ.

13
задан Jaroslav Moravec 2 June 2010 в 08:56
поделиться

11 ответов

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

Используйте, например, файл PHP на http://thirdDomain.com/session.php , который включен на все страницы обоих магазинов.

Пример:

<script type="text/javascript" src="http://thirdDomain.com/session.php"></script>

После того, как ваш клиент сменит домен, вы можете идентифицировать его как того же клиента, использующего третий домен.

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

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

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

9
ответ дан 1 December 2019 в 23:47
поделиться

SSO.

В CartA есть iframe, который 1) проверяет, является ли пользователь "активным" (есть ли у него сеанс) 2) создает анонимный сеанс. В CartB есть iframe, который выполняет 1) или 2)

загрузку iframe из домена SSO (любой домен, который у вас может быть)

Решение SSO: создайте свое или используйте другие - например, simplesamlphp или что-то в этом роде ...

И там должно быть нет необходимости передавать сеансы / параметры с URI ...

0
ответ дан 1 December 2019 в 23:47
поделиться

Это постоянно спрашивают.

Найдите SSO.

Вам необходимо передать идентификатор сеанса в URL-адресе (или в POST-запросе) по доменам, затем:

1) проверьте, что сеанс еще не существует в целевом домене

2) повторно привязать сеанс с помощью отправленный идентификатор сеанса

например

if ((!$_COOKIE[session_name()]) && $_GET['passed_id']) {
    if (check_session_exists($_GET['passed_id'])) { 
        session_id($_GET['passed_id']);
    }
}
session_start();
...
function check_session_exists($id)
{
   $path=session_save_path() . $id;
   if (file_exists($path) && (time()-filemtime($path)<session_cache_expire())) {
      return true;
   }
   return false;
}

Это также означает, что вам нужно добавить '? Pass_id ='. urlencode (session_id ()) на любой URL-адрес, указывающий на другой домен.

С.

4
ответ дан 1 December 2019 в 23:47
поделиться

Вы можете хранить данные не в файлах cookie, а в других местах (например,Flash cookie, localStorage ), но все они используют одну и ту же политику происхождения, которая является стандартной моделью безопасности в Интернете: данные, хранящиеся в домене, могут быть доступны только этому домену и его поддоменам. Стандартный обходной путь - встроить в страницу iframe из чужого домена. Этот iframe будет иметь доступ к файлам cookie внешнего домена, а его URL-адрес будет контролироваться локальным доменом, что позволяет осуществлять обмен данными.

Простое решение, основанное на этом, - иметь таблицу пар (domainA sessionid, domainB sessionid). Когда новый пользователь прибывает в domainA, (новый идентификатор сеанса, NULL) добавляется в таблицу; показанная ему страница включает невидимый iframe с source = http: //domainB/mergeSessions.php? sessionA = 1234 . Затем mergeSessions.php получит sessionA в качестве параметра URL и sessionB в качестве файла cookie и соответствующим образом обновит таблицу ссылок сеанса.

0
ответ дан 1 December 2019 в 23:47
поделиться

Как насчет чего-то подобного, не уверен, насколько это будет хорошо.

Пользователь переходит в магазин1. Если у пользователя нет куки сессии, перенаправление на специальную страницу на store2 с запросом идентификатора сессии и отправкой url на store1 для возврата. Специальная страница просматривает куки сессии и перенаправляет обратно на исходный url на store1 с идентификатором сессии (как в ответе @symcbean). Затем на store1 сессионный cookie устанавливается (или создается новый), и перенаправления больше не происходит. И то же самое, но наоборот, если пользователь находится на store2 без куки сессии.

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

Но в лучшем случае этот способ будет неэффективным.

0
ответ дан 1 December 2019 в 23:47
поделиться

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

Если в течение небольшого промежутка времени, скажем < 5 минут, приходят запросы с этого IP с этими параметрами, вы можете обоснованно предположить, что это один и тот же пользователь. Опять же, убедитесь, что вы используете все, что можете найти для идентификации этого пользователя, и ни в коем случае не основывайте на этом ничего безопасного, иначе вы будете подвержены перехвату.

0
ответ дан 1 December 2019 в 23:47
поделиться

Думаю, для этого можно использовать Flash LSO. Обычно LSO хранятся в песочницах, специфичных для их домена, но если два объекта домена позволяют, они могут обмениваться данными, как указано в разделе «Межфильмовое взаимодействие» в http://download.macromedia.com/pub/flash/whitepapers /security.pdf . Для получения общей информации о LSO: http://www.adobe.com/products/flashplayer/articles/lso/

1
ответ дан 1 December 2019 в 23:47
поделиться

1) Очевидно, используйте одно и то же хранилище сеансов для обоих доменов (файлы, база данных, memcached, обычные подозреваемые.
2) Если после session_start () $ _SESSION пуст, создайте массив «все домены» в сеансе (сделайте это для каждого домена, независимо от того, какой это).

$_SESSION['all_domains'] = array(
    'domain1.com'  => true, //<= current domain the customer is on,
    'domain2.com'  => false, //other domain, no cookie for it yet.
    'domain2.com'  => false); //repeat for all domains needed

3) Создайте сценарий установки сеанса для всех доменов (назовем его sesset.php:

 <?php
     if(isset($_GET['sessid']){
          session_id($_GET['sessid']);
          session_start();
          //also, check here for the domains:
          if(!isset($_SESSION['all_domains'])){
              //set the array as before, flag this domain as true.
          } else {
              $_SESSION['all_domains'][$_SERVER['HTTP_HOST']] = true;
              //you might want to set a custom domainname instead of HTTP_HOST, so you won't get doubles from domain with & without www. and so on.
          }
     }
 ?>

4) На каждой мыслимой HTML-странице php поместите это где-нибудь в конце тела:

 <?php
     foreach($_SESSION['all_domains'] as $domain => $domainset){
         if(!$domainset){
             echo '<img src="http://'.$domain.'/sesset.php?sessid='.session_id().' width="1" height="1"/>';
         }
     }
 ?>

Not полная стойкость, но достанется почти всем пользователям. Конечно, это можно было бы сделать с помощью каскада перенаправления вместо «скрытых изображений», но поисковые роботы (Google и др.) Очень запутались в этом, особенно если они не помнят cookie и застревают при перенаправлении снова и снова.

0
ответ дан 1 December 2019 в 23:47
поделиться

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

В вашем случае выберите один из доменов, который будет «checkout» -доменом (A) - это домен, который будет хранить сеанс. В том же домене вы создаете небольшой файл с конечной точкой easyXDM, которая отвечает за хранение / получение данных, отправленных из другого домена (B).

Теперь в домен B вы включаете easyXDM и вместо этого при сохранении / извлечении данных из корзины вы обращаетесь к методам RPC.

0
ответ дан 1 December 2019 в 23:47
поделиться

Схема довольно проста и широко используется. Например, google для своих многочисленных сервисов. Чтобы получить представление о схеме, можно проследить HTTP-обмен между вашим браузером и различными службами google.

Предположим, что наш клиент авторизован на 1-м домене. Переходя ко второму, мы должны:

  1. начать сессию и сохранить в ней токен.
  2. попросить браузер как-то запросить 1-й домен и отправить этот токен.
  3. Первый домен узнает нашего клиента и установит соединение в общей базе данных между этим токеном и идентификатором пользователя.
  4. Снова запросив второй домен, мы получим его авторизацию для уже начатой сессии.

Остается только один вопрос - как запросить первый домен. Это может быть картинка, или JS запрос, или редирект всей страницы. Определенный выбор за вами.

3
ответ дан 1 December 2019 в 23:47
поделиться

Вариант 1 Использование iframe:

  • Сайт 1 имеет iframe сайта 2
  • Сайт 2 имеет iframe сайта 1

Когда пользователь выбирает элемент с сайта 1, установите значение iframe на динамическое строка, т.е. domain2.com/iframe.php?itemid=someitem.

Попросите domain2 получить информацию $ _GET с помощью PHP из iframe и обновить cookie пользователя.

Сделайте то же самое в другом направлении.

Вариант 2: Javascript включает

Вы можете сделать что-то подобное с включенными между сайтами JS-файлами, сгенерированными PHP, чтобы «перетащить» содержимое файла cookie пользователя на другой сайт.

Вариант 3: Curl

Просто отправьте данные из одного домена в другой, чтобы у обоих были копии. Это наименее безопасный метод, поскольку нет гарантии, что IP-адрес или другие идентифицирующие данные не могут быть скопированы. Тем не менее, вы можете задать вопрос или передать фразу, чтобы убедиться, что это один и тот же человек. Возможно, установив адрес электронной почты?

Вариант 4: Сторонние файлы cookie

Я думаю, что об этом уже упоминалось, но вы можете установить файлы cookie из третьего домена, так что оба сайта функционально одинаковы, а не "переключаются" "туда и обратно между ними.

0
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: