Как установить cookie для другого домена

166

Скажем, у меня есть веб-сайт, который называется a.com, и когда загружается определенная страница этого сайта, скажем, ссылка на страницу, я хочу установить файл cookie для другого сайта с именем b.com, а затем перенаправить пользователя на b.com.

Я имею в виду, при загрузке a.com/linkя хочу установить cookie для b.comи перенаправить пользователя на b.com.

Я проверил его, и браузер фактически получил cookie от a.com/link, но он не отправил этот cookie в запросе на перенаправление b.com. Это нормально?

Можем ли мы установить куки для других доменов?

Расул Забихи
источник
Имейте в виду, что если вы используете параметры URL для установки файлов cookie на b.com, то любой может принудительно установить любое значение cookie на b.com с любого веб-сайта.
Жюльен
2
используйте iFrame на b.com, который устанавливает cookie;)
Jaquarh

Ответы:

129

Вы не можете установить куки для другого домена. Разрешение этого представило бы огромный недостаток безопасности.

Вы должны получить b.com, чтобы установить cookie. Если a.com перенаправить пользователя наb.com/setcookie.php?c=value

Сценарий setcookie может содержать следующее для установки cookie и перенаправления на нужную страницу на b.com.

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
источник
Но при перенаправлении на b.com a.com может вставить те же данные в виде заголовка, не так ли? Почему это не является недостатком безопасности?
Кодер
3
@Coder, функция setcookie приведет к отправке заголовка cookie в браузер с b.com. a.com не может отправить заголовок cookie с b.com.
qbert220
да, это очень небезопасно, но это работает. Если у ОП есть a.com и b.com, а файл cookie довольно тривиален, то, возможно, это нормально.
Ракеты проходят
1
Лучше заметить в ответе, что это небезопасно, хотя и работает.
Рой Лин
2
как вы можете сказать это, однако youtube читает куки, созданные gmail, чтобы показать свою учетную запись на youtube?
TAHA SULTAN TEMURI
55

Аналогично верхнему ответу, но вместо перенаправления на страницу и обратно, что приведет к плохому пользовательскому опыту, вы можете установить изображение в домене A.

<img src="http://www.example.com/cookie.php?val=123" style="display:none;">

И затем в домене B, который является example.com в cookie.php, у вас будет следующий код:

<?php
    setcookie('a', $_GET['val']);
?>

Hattip к Шубину

Джонатан
источник
1
хороший хак ... :)
Sotn
16
Осторожно, это, наверное, очень плохая идея. Вы обходите преднамеренную защиту файлов cookie, позволяя любому отправлять специально созданный запрос GET, чтобы установить для этого файла cookie любое желаемое значение. Я не знаю, что вы тогда делаете с этим cookie, но я надеюсь, что это не связано с банковским балансом.
Скотт Стаффорд
Уверяю вас, это не касалось банковского баланса. Но хороший момент :)
Джонатан
2
Если, как и в этом случае, каждый может вызвать этот домен со своим параметром, вы можете добавить безопасность, добавив еще один параметр. Создайте хеш с данными и дополнительной солью и передайте его в качестве параметра. В вашем cookie.php просто проверьте данные в $ _GET ['val'], воссоздав токен и сравнив их.
Себа М
Если вы отправляете GET таким способом, вы также можете использовать AJAX.
user10398534
18

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

Ондрей Бозек
источник
1
iframe отлично работал для моего решения, просто включите значения в URL, как обычный запрос get, и ответьте с сервера значениями cookie
Джоэл Дэвис,
Имейте в виду, у вас должен быть правильно настроен Access-Control-Allow-Origin, чтобы это работало.
user10398534
6

Настройка файлов cookie для другого домена невозможна.

Если вы хотите передать данные в другой домен, вы можете закодировать это в URL.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
источник
4
установка cookie сеанса из URL-адреса представляет собой угрозу безопасности. URL-адреса обычно записываются в журнал и позволяют злоумышленнику украсть сеанс пользователя
Дейн Маколей
6

Вы не можете, по крайней мере, не напрямую. Это было бы неприятным риском для безопасности.

В то время как вы можете указать атрибут Домена , спецификация гласит: «Пользовательский агент будет отклонять куки, если атрибут Домена не задает область для куки, которая будет включать исходный сервер».

Так как исходный сервер есть a.comи не включает b.com, его нельзя установить.

Вам нужно будет b.comустановить cookie вместо этого. Вы можете сделать это через (например) HTTP перенаправления туда b.comи обратно.

Quentin
источник
Я знаю, что это старый ответ, но почему это было бы угрозой безопасности? Вы можете установить куки в вашей консоли или в расширении? Почему это имеет значение, если вы можете установить cookie для другого домена?
Тимберман
1
@Timberman - Вопрос в том, что JavaScript работает на сайте, а не в инструментах разработчика и не в явно установленном расширении. Это было бы угрозой безопасности, потому что у любого посетителя evil-hack.com мог быть установлен файл cookie their-favourite-website.com, который изменил бы их предпочтения на этом сайте.
Квентин
Я понимаю это, но как это угроза безопасности? Я почти уверен, что не имеет ничего общего с безопасностью?
Тимберман
@Timberman - Если вы не видите проблемы с сайтом злоумышленника, который меняет ваши настройки для совершенно другого сайта, то я не знаю, как объяснить это более четко.
Квентин
Я вижу проблему, но я не вижу, как это представляет угрозу безопасности. Я согласен с вами, что javascript не должен иметь возможность устанавливать cookie для другого домена, но как это проблема безопасности, если это было возможно?
Тимберман
5

Если у вас есть, a.my-company.comа b.my-company.comне только a.comи b.comвы можете создать cookie для .my-company.comдомена - он будет принят и отправлен на оба домена.

стоп-Cran
источник
1
Можно ли создать файл cookie в a.my-company.com для b.my-company.com?
Махеш Каджале
1
Если my-company.com не находится в списке публичных суффиксов, то в этом случае браузер будет молча игнорировать все попытки установить cookie! : '- (
Майкл
5

см. RFC6265 :

Пользовательский агент будет отклонять куки, если атрибут Domain не указывает область для куки, которая будет включать исходный сервер. Например, пользовательский агент примет файл cookie с атрибутом домена «example.com» или «foo.example.com» от foo.example.com, но пользовательский агент не примет файл cookie с атрибутом домена "bar.example.com" или "baz.foo.example.com".

ПРИМЕЧАНИЕ. В целях безопасности многие пользовательские агенты настроены на отклонение атрибутов домена, соответствующих «общедоступным суффиксам». Например, некоторые пользовательские агенты будут отклонять атрибуты домена «com» ​​или «co.uk». (См. Раздел 5.3 для получения дополнительной информации.)

Но вышеупомянутый обходной путь с image / iframe работает, хотя это не рекомендуется из-за его небезопасности.

Рой Лин
источник
1

Вы не можете, но ... Если у вас есть обе страницы, то ...

1) Вы можете отправить данные через параметры запроса ( http://siteB.com/?key=value )

2) Вы можете создать iframe сайта B внутри сайта A и отправлять сообщения из одного места в другое. Поскольку сайт B является владельцем файлов cookie сайта B, он сможет установить любое необходимое вам значение, обработав правильное почтовое сообщение. (Вы должны запретить другим нежелательным отправителям отправлять вам сообщения! Это зависит от вас и механизма, который вы решите использовать, чтобы этого не произошло)

CSN
источник
0

В этой ссылке мы найдем решение Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Харихаран А.Р.
источник
1
Это не сработает. См. Спецификацию : «Пользовательский агент будет отклонять куки, если атрибут Domain не определяет область для куки, которая будет включать исходный сервер».
Квентин
0

Отправьте запрос POST от A. Почтовые запросы находятся только на стороне сервера и не могут быть доступны клиенту.

Вы можете отправить запрос POST от a.comс b.comпомощью CURL (рекомендуется) или стороне сервера скрытой method="POST"форме ( на стороне клиента). Если вы выберете последний вариант, вы можете захотеть запутать свой JavaScript, чтобы пользователь не мог понять алгоритм и вмешиваться в него.

Сделайте шлюз b.comдля установки файлов cookie:

<?php
    if (isset($_POST['data']) {
        setcookie('a', $_POST['data']);
        header("Location: b.com/landingpage");
    }
?>

Если вы хотите повысить безопасность на шаг вперед, реализуйте функцию с обеих сторон ( a.comи b.com) для шифрования (включения a.com) и дешифрования (включения b.com) данных с использованием криптографического шифра.

Если вы пытаетесь сделать что-то, что должно быть абсолютно безопасным (например, перенести сеанс входа в систему), попробуйте oAuth или вдохновитесь https://api.cloudianos.com/docs#v2/auth

user10398534
источник