Як встановити файл cookie для іншого домену


166

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

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

Я перевірив це, і браузер фактично отримав файл cookie від a.com/link, але він не надіслав цей файл cookie на запит на переадресацію b.com. Це нормально?

Чи можемо ми встановити файли cookie для інших доменів?


Майте на увазі, що якщо ви використовуєте параметри URL-адреси для встановлення файлів cookie на b.com, будь-хто може змусити будь-яке значення файлу cookie на b.com з будь-якого веб-сайту.
Жульєн

2
використовуйте iFrame з b.com, який встановлює файли cookie;)
Jaquarh

Відповіді:


129

Ви не можете встановити файли cookie для іншого домену. Якщо це дозволити, це створило б величезний недолік у безпеці.

Щоб встановити файл cookie, вам потрібно отримати b.com. Якщо a.com перенаправляє користувача наb.com/setcookie.php?c=value

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

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>

Тим не менш, a.com може вставити ті самі дані у вигляді заголовка при переадресації на b.com, чи не так? Чому це не є недоліком безпеки?
Кодер

3
@Coder, функція setcookie призведе до того, що заголовок файлу cookie буде відправлений у браузер із b.com. a.com не може надіслати заголовок файлу cookie від b.com.
qbert220

так, це дуже небезпечно, але це працює. Якщо ОР володіє a.com та b.com, а файл cookie є досить тривіальним, то, можливо, це добре.
racketsarefast

1
у відповіді краще помітити, що це небезпечно, хоча це працює.
Рой Лінг

2
як ви можете сказати це, проте youtube читає файли cookie, створені gmail, щоб показати свій обліковий запис на youtube?
TAHA SULTAN TEMURI

55

Подібно до верхньої відповіді, але замість того, щоб перенаправляти на сторінку і знову, що спричинить поганий досвід користувача, ви можете встановити зображення на домен А.

<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
nice hack ... :)
sotn

16
Остерігайтеся, що це, мабуть, дуже погана ідея. Ви обминаєте дуже навмисні засоби захисту файлів cookie, в основному дозволяючи будь-кому надсилати складений GET-запит, щоб встановити цей файл cookie будь-якого значення. Я не знаю, що ви тоді робите з цим файлом cookie, але я сподіваюся, що він не передбачає балансу банку.
Скотт Стаффорд

Можу запевнити, що він не передбачав балансу банку. Але хороший момент :)
Джонатан

2
Якщо в цьому випадку кожен може зателефонувати на цей домен зі своїм власним параметром, ви можете додати безпеку, додавши інший параметр. Створіть хеш із даними та додатковою сіллю та передайте їх як параметр. У вашому cookie.php просто перевірте дані в $ _GET ['val'], відтворивши маркер і порівнявши їх.
Себа М

Якщо ви надсилаєте GET таким чином, ви також можете використовувати AJAX.
користувач10398534

18

Probaly ви можете використовувати Iframeдля цього. Facebook, ймовірно, використовує цю техніку. Більше про це можна прочитати тут . Stackoverflow використовує подібну техніку, але з локальним зберіганням HTML5, про це докладніше у своєму блозі


1
iframe працював ідеально для мого рішення, просто включіть значення в URL-адресу, як звичайний запит на отримання, і відповідь з сервера зі значеннями файлів cookie
Джоель Девіс,

Будьте в курсі, для цього вам потрібно правильно налаштувати Access-Control-Allow-Origin.
користувач10398534

6

Встановити файли cookie для іншого домену неможливо.

Якщо ви хочете передати дані в інший домен, ви можете кодувати це в URL.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page

4
встановлення сеансового файлу cookie з URL-адреси - це загроза безпеці. URL-адреси зазвичай реєструються і дозволяють зловмиснику вкрасти сеанс користувачів
Дейн Макалей

6

Ви не можете, принаймні, безпосередньо. Це було б неприємним ризиком для безпеки.

У той час як ви можете вказати атрибут Domain , специфікація говорить "Агент користувача буде відкидати файли cookie, якщо в атрибуті Domain не вказано область cookie, яка б включала в себе початковий сервер."

Оскільки початковий сервер є a.comі не включає b.com, його не можна встановити.

Вам потрібно b.comбуде встановити печиво замість цього. Це можна зробити за допомогою (наприклад) переадресації HTTP на b.comта назад.


Я знаю, що це стара відповідь, але чому це може бути ризиком для безпеки? Ви можете встановити файли cookie в консолі чи в додатку? Чому це має значення, якщо ви можете встановити файл cookie для іншого домену?
Тімберман

@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домену - він буде прийнятий і надісланий обом доменам.


1
чи можна створити cookie в a.my-company.com для b.my-company.com?
mahesh kajale

1
Якщо тільки my-company.com не знаходиться у списку чорних дір Public Suffix, тоді браузер мовчки ігнорує всі спроби встановити cookie! : '- (
Майкл

5

див. RFC6265 :

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

ПРИМІТКА. З міркувань безпеки багато агентів користувача налаштовані на відхилення атрибутів Домену, які відповідають "загальнодоступним суфіксам". Наприклад, деякі користувацькі агенти будуть відхиляти атрибути домену "com" або "co.uk". (Для отримання додаткової інформації див. Розділ 5.3.)

Але вищезазначене вирішення із зображенням / iframe працює, хоча це не рекомендується через його незахищеність.


1

Ви не можете, але ... Якщо у вас є обидві сторінки, тоді ...

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

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


0

У цьому посиланні ми знайдемо рішення Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);

1
Це не спрацює. Див . Специфікацію : "Агент користувача буде відхиляти файли cookie, якщо в атрибуті" Домен "не буде вказано область для файлу cookie, яка б включала в себе початковий сервер."
Квентін

0

Надіслати запит на пошту від А. Повідомлення про розміщення пошти є лише на сервері, і клієнт не може отримати доступ до них.

Ви можете відправити запит 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.