Междоменные PHP-сессии - PullRequest
6 голосов
/ 27 августа 2009

Я создаю сайт, который позволяет пользователю указывать запись CNAME на моем сайте для запуска своих «профилей», это позволяет вашему СОБСТВЕННОМУ доменному имени загружать ваш профиль на моем сайте.

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

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

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

Ответы [ 4 ]

5 голосов
/ 27 августа 2009

Вы не можете установить 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 Redirects.

Если хост 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.

4 голосов
/ 27 августа 2009

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

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

1 голос
/ 25 июля 2011

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

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/

0 голосов
/ 27 августа 2009

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

if (isset ($ _ REQUEST ['sid'])) session_id ($ _ REQUEST [ 'с.и.д.']);

session_start ();

и вызовите скрипт так www.userprofiles.com/profile.php?userid=1&sid=somesessionid1234

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