Межсетевые сеансы - совлокальные домены корзины покупок

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

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

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

Пример:

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

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

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

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

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

Ответ 2

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

Ищите SSO.

Вам необходимо передать идентификатор сеанса в URL (или vai 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-адреса, указывающего на другой домен.

С.

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

SSO.

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Но этот способ в лучшем случае был бы взломан.

Ответ 9

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) Создайте установщик сеанса script для всех доменов (пусть назовите его "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) На каждой мыслимой странице php HTML поместите это где-то ближе к концу тела:

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

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

Ответ 10

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

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

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

Ответ 11

Вариант 1 Используйте iframes:

  • На сайте 1 есть iframe сайта 2
  • На сайте 2 есть iframe сайта 1

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

Имейте domain2 захватить информацию $_GET с PHP из iframe и обновить файл cookie пользователя.

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

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

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

Вариант 3: Curl

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

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

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