Междоменные сессии PHP

Я создаю сайт, который позволяет пользователю указывать запись CNAME на моем сайте для запуска своих «профилей», это позволяет вашему доменному имени OWN загружать ваш профиль на моем сайте.

Это поднимает всевозможные вопросы, связанные с сеансами. Я видел, как вирб сделал это. Я не вижу никакой информации, которая основана на сеансе в iFrame … но на странице присутствует iFrame.

Я могу заставить материал домена работать, я просто теряю данные сеанса … Любые идеи?

(Вот пример – Ссылки на Virb – http://www.agentspider.com/ )

Solutions Collecting From Web of "Междоменные сессии PHP"

По умолчанию нельзя установить кросс-домен cookie. Я считаю, вы можете настроить P3P-файл (ы), чтобы включить его. http://p3ptoolbox.org/guide/section4.shtml#IVd Я сам этого не делал, поэтому не знаю, сколько из них реализовано в браузерах, или даже работает так.

Вирб выглядит так, как будто он использует JavaScript. Он имеет библиотеку AJAX, которая делает запрос JSON-P на сервер virb, если не установлен cookie сеанса. (первая загрузка Firefox вы можете увидеть это в Firebug). Ответ JSON просто позволяет странице узнать, зарегистрирован ли пользователь или нет, и обновляет части страницы, которые должны отражать статус пользователя.

Итак, что происходит, страница встраивает некоторые JS из virb.com. Поскольку домен virb.com, cookie, установленный на virb.com, отправляется на сервер. Затем сервер отвечает на результат файла cookie на внешний сайт.

В случае virb, который не будет работать должным образом без JS, я думаю, что это хороший вариант. Однако вы можете сделать то же самое с HTTP-переадресацией.

Если хост HTTP не является основным доменом (example.com):

if (!$_COOKIE['sessionid'] && $_SERVER['HTTP_HOST'] != 'example.com') { // redirect to your main site header('Location: http://example.com'); } 

На главном сайте установите cookie и отправьте пользователя обратно во внешний домен (domain.com), передавая идентификатор сеанса в Location.

 header('Location: http://domain.com.com?sessid='.urlencode($_COOKIE['sessionid'])); 

Последний бит – перенаправить обратно на страницу, на которой вы были, теперь, когда у вас есть тот же сеанс.

 setCookie(...); // sessid in $_GET['sessid'] header('Location: http://domain.com/'); 

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

Поскольку вы просто используете заголовки (вам не нужно выводить содержимое), и в большинстве случаев HTTP / 1.1, поэтому вы будете в одном и том же TCP-сокете, я думаю, что он довольно эффективен и будет более поддерживаться, чем вариант JavaScript.

Изменить: не забудьте установить cookie, когда вернетесь во внешний домен.

Последний шаг является необязательным, но он не поддерживает sessid в URL-адресе. Это скорее проблема безопасности, чем сохранение в заголовках HTTP.

Единственный способ – добавить идентификаторы сеанса к URL-адресам, которые переходят из одного домена в другой (или добавить этот идентификатор сеанса в URL-адрес iframe src), а затем закодировать ваш сервер хранения сеанса, чтобы справиться с этим.

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

Нет ничего проще:

1) создать domain1.com/client.html с исходным кодом:

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script > 2) создать domain2.com/server_set_cookie.php с источником php:

 header("p3p: CP=ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"); setcookie($_REQUEST['cookie_name'], 'cookie_name', time()+3600); 

http://smartcoding.wordpress.com/2009/07/12/setcookie-cross-domain-cookie-write/

не уверен, что я понимаю вашу проблему. Это что-то вроде другого домена, вызывающего что-то вроде http://www.userprofiles.com/profile.php?userid=1 и отображения результатов? В этом случае profile.php будет генерировать новый идентификатор сеанса всякий раз, когда он будет вызван. Вам нужно установить разные идентификаторы для каждого внешнего домена с помощью вашего сайта и изменить profile.php на что-то вроде:

if (isset ($ _ REQUEST ['sid'])) session_id ($ _ REQUEST ['sid']);

session_start ();

и вызовите скрипт следующим образом: http://www.userprofiles.com/profile.php?userid=1&sid=somesessionid1234