2011-02-05 6 views
7

Я хочу создать cookie из одного домена после регистрации пользователя на PHP. и сделать этот файл cookie доступным для 4 других доменов, а не для поддоменов. Я знаю, что файлы cookie не предназначены для доступа к другим доменам. Например, я установил переменную cookie $ user_email из домена www.firstdomain.com и хочу получить к ней доступ в других доменах, таких как www.seconddomain.com, www.thirddomain.com и т. Д. Возможно, это можно сделать с помощью PHP или JavaScript. Любая идея, пожалуйста.PHP Cookies для нескольких доменов

Спасибо!

ответ

6

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

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

+0

Я думаю, что эта статья объясняет довольно лаконично: http://www.codeguru.com/csharp/csharp/cs_internet/article.php/c19417/Sharing-Cookies-Across-Domains.htm – peteski

1

Я решил точно такую ​​же проблему (фактически также для 4 доменов). Единственное решение, с которым я столкнулся, состояло в том, чтобы включить 3 скрытых фрейма на «Успешную страницу входа», и эти iframes просто загружают www.domain1.com/register_session.php, www.domain2.com/register_session.php и т. Д. ...

в качестве параметра для register_session.php я использую «с.и.д.», который содержит идентификатор сеанса:

session_id($_GET['sid']); 
session_start(); 

Это на самом деле для поддержания сеанса в живых на всех этих областях, но то же самое было бы для вашего дела с куки.

+0

В качестве альтернативы, вы можете просто сделать запрос AJAX с кросс-началом через [CORS] (http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -origin-sharing-sharing /) для передачи информации через домены. –

9

При поиске в список куки для действительного печенья, сравнение доменов атрибутов печенья является сделано с доменным именем интернетовской хоста, с которого URL будет неправдоподобными. Если есть хвостовое совпадение, , то cookie пройдет путь , соответствующий, чтобы узнать, нужно ли его отправлять. «Соответствие хвоста» означает, что атрибут домена сопоставляется с хвостом от полного доменного имени хоста. Атрибут домена «acme.com» соответствует именам хостов «anvil.acme.com», а также «shipping.crate.acme.com». Только хосты в указанном домене могут установить cookie для домена, а домены должны иметь не менее двух (2) или трех (3) периодов в них, чтобы домены домена получили форму: «.com», «. edu "и" va.us ". В любом домене, который сбой в одном из , на семи специальных доменах верхнего уровня , перечисленных ниже, требуется только два периода. Для любого другого домена требуется не менее . Семь специальных верхних уровней доменов: «COM», «EDU», «NET», «ORG», «GOV», «MIL» и «INT».

Значение по умолчанию для домена - имя хоста сервера, на котором сгенерировал ответ файла cookie.

читать here.

вы можете загрузить iframe с хоста, который затем перезагружает себя закодированным значением cookie в части сегмента (после #).

вы можете получить доступ к атрибуту document.location из родительского окна (попадает только в то, что доступно). расшифруйте его и передайте на сервер, выполнив запрос ajax.

Это может быть так.

xss.php (находится на cookie.example.com):

<?php 
$data = array(
'uid' => $_COOKIE['uid'], 
'loginhash' => $_COOKIE['loginhash']); 
header('Location: xss.php#'.urlencode(json_encode($data))); 

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

другой сайт встраивается xss.php:

<iframe id="cookies" src="http://cookies.example.com/xss.php"></iframe> 

you need to somehow delay the following of do it in a loop that stops after 5 seconds or something. 

if(document.getElementById('cookies').location != 'http://cookies.example.com/xss.php') { 
// read location, extract hashtag, json decode using javscript, there you have your user. send it to server for validation or whatever. 
} 

это teqnique называется XSS ПОЛУЧАТЬ. он, например, используется facebook для всех их библиотек подключений javascript.

Вероятно, лучшим способом будет какой-то токен, обменный протокол, такой как openid.

Amazon использует это тоже.

вы можете настроить провайдера openid (есть библиотеки, которые могут сделать это из коробки) и настроить его для автоматического перенаправления обратно без взаимодействия с пользователем. я часто видел протокол openid, используемый для некоторых других целей, как междоменная связь.

+0

Не могли бы вы отредактировать свой ответ (может быть, дать образец кода примера), чтобы я мог повторно поддержать вас? Я случайно расстегнул верхнюю часть. –

+0

приход прямо. –

+0

Я думаю, что это можно сделать более элегантным способом, но принцип остается тем же самым. –

1

я ве сделал несколько сценариев для обработки несколько доменов печенья:

https://code.google.com/p/mudoco/

+0

Очень круто, Идти, чтобы дать ему вихрь позже сегодня, бросьте это на GitHub, и я буду способствовать –

0

, если вы хотите получить доступ к кукам в разных доменах, так это может быть сделано с помощью яваскрипта трюка. Поскольку cookie можно получить в пределах одного домена.

  1. Создать cookie в браузере пользователя с помощью JavaScript в вашем домене.

  2. Задайте имя окна независимо от того, какое значение cookie вы хотите перенести в другой домен, используя window.name.

  3. Шаг 2 должен выполняться на каждой странице домена, который создал файл cookie. Это может быть легко, вызвав файл JavaScript на всех страницах.

  4. Когда вы переезжаете в другой домен и хотите получить доступ к вышеуказанному значению cookie, обратитесь к нему с помощью window.name, так как window не изменился.

  5. Создайте новый файл cookie в этом домене и присвойте ему это значение.

Смежные вопросы