Jak ustawić plik cookie dla innej domeny

166

Załóżmy, że mam wywoływaną witrynę internetową a.com, a kiedy ładuje się konkretna strona tej witryny, powiedzmy łącze do strony, chcę ustawić plik cookie dla innej witryny o nazwie b.com, a następnie przekierować użytkownika do b.com.

Chodzi mi o to, że po załadowaniu a.com/linkchcę ustawić plik cookie dla b.comi przekierować użytkownika do b.com.

Przetestowałem to i przeglądarka faktycznie otrzymała plik cookie od a.com/link, ale nie wysłała go w żądaniu przekierowania do b.com. Jest to normalne?

Czy możemy ustawić pliki cookie dla innych domen?

Rasoul Zabihi
źródło
Należy pamiętać, że jeśli używasz parametrów adresu URL do ustawiania plików cookie w b.com, każdy może wymusić dowolną wartość pliku cookie w b.com z dowolnej witryny.
Julien
2
użyj ramki iFrame z b.com, która ustawia plik cookie;)
Jaquarh

Odpowiedzi:

129

Nie możesz ustawić plików cookie dla innej domeny. Zezwolenie na to stanowiłoby ogromną lukę w zabezpieczeniach.

Aby ustawić plik cookie, musisz pobrać b.com. Jeśli a.com przekierowuje użytkownika dob.com/setcookie.php?c=value

Skrypt setcookie może zawierać następujące elementy służące do ustawienia pliku cookie i przekierowania do właściwej strony w witrynie b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
źródło
Jednak a.com może wstawić te same dane w postaci nagłówka podczas przekierowywania do b.com, czyż nie? Dlaczego nie stanowi to luki w zabezpieczeniach?
Coder
3
@Coder, funkcja setcookie spowoduje wysłanie nagłówka cookie do przeglądarki z b.com. a.com nie może wysłać nagłówka pliku cookie z b.com.
qbert220
tak, to jest bardzo niepewne, ale działa. Jeśli OP posiada domeny a.com i b.com, a plik cookie jest dość trywialny, to może jest w porządku.
rocketsarefast
1
lepiej zauważ w odpowiedzi, że jest to niebezpieczne, chociaż działa.
Roy Ling
2
jak możesz to powiedzieć, ale youtube czyta pliki cookie utworzone przez Gmaila, aby pokazać swoje konto na youtube?
TAHA SULTAN TEMURI
55

Podobnie jak w przypadku pierwszej odpowiedzi, ale zamiast przekierowywania na stronę iz powrotem, co spowoduje złe wrażenia użytkownika, możesz ustawić obraz w domenie A.

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

Następnie w domenie B, czyli example.com w pliku cookie.php, będziesz mieć następujący kod:

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

Hattip do Subin

Jonathan
źródło
1
niezły hack ... :)
sotn
16
Uważaj, to prawdopodobnie bardzo zły pomysł. Omijasz bardzo celowe zabezpieczenia plików cookie, w zasadzie pozwalając każdemu wysłać spreparowane żądanie GET, aby ustawić ten plik cookie na dowolną wartość. Nie wiem, co zrobisz z tym ciasteczkiem, ale mam nadzieję, że nie wiąże się to z saldem bankowym.
Scott Stafford
Zapewniam, że nie dotyczyło to salda w banku. Ale słuszna uwaga :)
Jonathan
2
Jeśli tak jak w tym przypadku każdy może wywołać tę domenę z własnym parametrem, możesz zwiększyć bezpieczeństwo dodając kolejny parametr. Utwórz skrót z danymi i dodatkową solą i przekaż go jako parametr. W pliku cookie.php po prostu zweryfikuj dane w $ _GET ['val'], odtwarzając token i porównując je.
Seba M
Jeśli wysyłasz GET w ten sposób, równie dobrze możesz użyć AJAX.
user10398534
18

Prawdopodobnie możesz Iframedo tego użyć . Facebook prawdopodobnie używa tej techniki. Możesz przeczytać więcej na ten temat tutaj . Stackoverflow używa podobnej techniki, ale z lokalną pamięcią HTML5, więcej na ten temat na ich blogu

Ondrej Bozek
źródło
1
iframe działało idealnie dla mojego rozwiązania, po prostu umieść wartości w adresie URL jak normalne żądanie get i odpowiedz z serwera z wartościami cookie
Joel Davis
Pamiętaj, że aby to działało, musisz mieć poprawnie skonfigurowane źródło kontroli dostępu.
user10398534
6

Ustawienie plików cookie dla innej domeny nie jest możliwe.

Jeśli chcesz przekazać dane do innej domeny, możesz zakodować to w adresie URL.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
źródło
4
ustawienie sesyjnego pliku cookie z adresu URL stanowi zagrożenie bezpieczeństwa. adresy URL są zwykle rejestrowane i pozwalają napastnikowi na kradzież sesji użytkownika
Dane Macaulay
6

Nie możesz, przynajmniej nie bezpośrednio. To byłoby paskudne zagrożenie bezpieczeństwa.

Chociaż można określić atrybut domeny , w specyfikacji jest napisane: „Klient użytkownika odrzuci pliki cookie, chyba że atrybut domeny określa zakres dla pliku cookie, który obejmowałby serwer pochodzenia”.

Ponieważ serwer pochodzenia jest a.comi nie obejmuje b.com, nie można go ustawić.

Zamiast tego musisz b.comustawić plik cookie. Możesz to zrobić za pomocą (na przykład) przekierowań HTTP do b.comiz powrotem.

Quentin
źródło
Wiem, że to stara odpowiedź, ale dlaczego miałoby to stanowić zagrożenie dla bezpieczeństwa? Możesz ustawić pliki cookie w konsoli lub w rozszerzeniu? Dlaczego miałoby to znaczenie, jeśli możesz ustawić plik cookie dla innej domeny?
Timberman
@Timberman - Pytanie dotyczy JavaScript działającego na stronie internetowej, której nie ma w narzędziach deweloperskich ani w jawnie zainstalowanym rozszerzeniu. Byłoby to zagrożenie dla bezpieczeństwa, ponieważ każdy odwiedzający evil-hack.com mógłby mieć ustawiony plik cookie their-favourite-website.com, który zmieniłby jego preferencje w tej witrynie.
Quentin
Rozumiem, ale jakie to zagrożenie bezpieczeństwa? Jestem pewien, że nie ma to nic wspólnego z bezpieczeństwem?
Timberman
@Timberman - Jeśli nie widzisz problemu z witryną atakującego zmieniającą Twoje preferencje na zupełnie inną witrynę, to nie wiem, jak to wyjaśnić dokładniej.
Quentin
Widzę problem, ale nie widzę, jakie to zagrożenie dla bezpieczeństwa. Zgadzam się z Tobą, że javascript nie powinien mieć możliwości ustawienia pliku cookie dla innej domeny, ale czy jest to problem z bezpieczeństwem, jeśli był w stanie to zrobić?
Timberman
5

Jeśli masz a.my-company.comi b.my-company.comzamiast tylko a.comi b.commożesz wystawić plik cookie dla .my-company.comdomeny - zostanie on zaakceptowany i wysłany do obu domen.

stop-cran
źródło
1
czy można utworzyć plik cookie w witrynie a.moja-firma.com dla domeny b.moja-firma.com?
mahesh kajale
1
O ile moja-firma.com nie znajduje się na czarnej liście sufiksów publicznych, w takim przypadku przeglądarka po cichu zignoruje wszystkie próby ustawienia pliku cookie! : '- (
Michael
5

zobacz RFC6265 :

Agent użytkownika odrzuci pliki cookie, chyba że atrybut domeny określa zakres dla pliku cookie, który obejmuje serwer pochodzenia. Na przykład agent użytkownika zaakceptuje plik cookie z atrybutem domeny „example.com” lub „foo.example.com” z foo.example.com, ale klient użytkownika nie zaakceptuje pliku cookie z atrybutem domeny równym „bar.example.com” lub „baz.foo.example.com”.

UWAGA: Ze względów bezpieczeństwa wiele programów użytkownika jest skonfigurowanych tak, aby odrzucać atrybuty domeny, które odpowiadają „publicznym sufiksom”. Na przykład niektóre programy użytkownika odrzucają atrybuty domeny „com” lub „co.uk”. (Aby uzyskać więcej informacji, patrz Rozdział 5.3).

Ale wspomniane powyżej obejście z image / iframe działa, chociaż nie jest zalecane ze względu na jego niepewność.

Roy Ling
źródło
1

Nie możesz, ale ... Jeśli jesteś właścicielem obu stron, to ...

1) Możesz wysłać dane za pomocą parametrów zapytania ( http://siteB.com/?key=value )

2) Możesz utworzyć ramkę iframe witryny B wewnątrz witryny A i wysyłać wiadomości pocztowe z jednego miejsca do drugiego. Ponieważ witryna B jest właścicielem plików cookie witryny B, będzie mogła ustawić dowolną potrzebną wartość, przetwarzając poprawną wiadomość pocztową. (Powinieneś uniemożliwić innym niechcianym nadawcom wysyłanie do Ciebie wiadomości! To zależy od Ciebie i mechanizmu, którego zdecydujesz się użyć, aby temu zapobiec)

cSn
źródło
0

W tym linku znajdziemy rozwiązanie Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Hariharan AR
źródło
1
To nie zadziała. Zobacz specyfikację : „Klient użytkownika odrzuci pliki cookie, chyba że atrybut domeny określa zakres dla pliku cookie, który obejmuje serwer pochodzenia”.
Quentin
0

Wyślij żądanie POST od A. Żądania pocztowe znajdują się tylko po stronie serwera i klient nie może uzyskać do nich dostępu.

Możesz wysłać żądanie POST z a.comdo, b.comużywając CURL (zalecane, po stronie serwera) lub ukrytego method="POST"formularza (po stronie klienta). Jeśli zdecydujesz się na to drugie, możesz chcieć zaciemnić swój JavaScript, aby użytkownik nie był w stanie zrozumieć algorytmu i ingerować w niego.

Włącz bramę, b.comaby ustawić pliki cookie:

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

Jeśli chcesz pójść o krok dalej w zakresie bezpieczeństwa, zaimplementuj po obu stronach ( a.comi b.com) funkcję szyfrowania (włączania a.com) i deszyfrowania (włączania b.com) danych przy użyciu szyfru kryptograficznego.

Jeśli próbujesz zrobić coś, co musi być absolutnie bezpieczne (np. Przenieść sesję logowania), wypróbuj OAuth lub zainspiruj się https://api.cloudianos.com/docs#v2/auth

user10398534
źródło