So setzen Sie ein Cookie für eine andere Domain

172

Angenommen, ich habe eine Website mit dem Namen " a.comWenn eine bestimmte Seite dieser Website geladen wird, z. B." Seitenlink ", möchte ich ein Cookie für eine andere Website mit dem Namen" Site "setzen b.comund den Benutzer dann zu weiterleiten b.com.

Ich meine, beim Laden a.com/linkmöchte ich ein Cookie setzen b.comund den Benutzer an weiterleiten b.com.

Ich habe es getestet und der Browser hat das Cookie tatsächlich von erhalten a.com/link, aber es hat dieses Cookie bei der Umleitungsanforderung nicht an gesendet b.com. Es ist normal?

Können wir Cookies für andere Domains setzen?

Rasoul Zabihi
quelle
Beachten Sie, dass jeder einen Cookie-Wert auf b.com von jeder Website erzwingen kann, wenn Sie URL-Parameter verwenden, um Cookies auf b.com zu setzen.
Julien
2
benutze einen iFrame von b.com, der ein Cookie setzt;)
Jaquarh

Antworten:

132

Sie können keine Cookies für eine andere Domain setzen. Dies zuzulassen würde eine enorme Sicherheitslücke darstellen.

Sie benötigen b.com, um das Cookie zu setzen. Wenn a.com den Benutzer umleitetb.com/setcookie.php?c=value

Das setcookie-Skript kann Folgendes enthalten, um das Cookie zu setzen und auf die richtige Seite auf b.com umzuleiten

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
quelle
A.com kann jedoch dieselben Daten in Form eines Headers einfügen, wenn es zu b.com umleitet, nicht wahr? Warum stellt dies keine Sicherheitslücke dar?
Coder
3
@Coder, die Setcookie-Funktion führt dazu, dass ein Cookie-Header von b.com an den Browser gesendet wird. a.com kann keinen Cookie-Header von b.com senden.
Qbert220
Ja, das ist sehr unsicher, aber es funktioniert. Wenn das OP a.com und b.com besitzt und der Cookie ziemlich trivial ist, ist er vielleicht in Ordnung.
Raketen sind schnell
1
In der Antwort sollte man besser bemerken, dass dies unsicher ist, obwohl es funktioniert.
Roy Ling
2
Wie können Sie dies sagen, obwohl YouTube von Google Mail erstellte Cookies liest, um deren Konto auf YouTube anzuzeigen?
TAHA SULTAN TEMURI
55

Ähnlich wie bei der Top-Antwort, aber anstatt zur Seite und wieder zurück umzuleiten, was zu einer schlechten Benutzererfahrung führt, können Sie ein Bild in Domäne A festlegen.

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

Und dann haben Sie auf Domain B, die example.com in cookie.php ist, den folgenden Code:

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

Hattip nach Subin

Jonathan
quelle
1
netter Hack ... :)
sotn
16
Beachten Sie, dass dies wahrscheinlich eine sehr schlechte Idee ist. Sie umgehen den sehr absichtlichen Cookie-Schutz, indem Sie grundsätzlich jedem erlauben, eine gestaltete GET-Anfrage zu senden, um dieses Cookie auf einen beliebigen Wert zu setzen. Ich weiß nicht, was Sie dann mit diesem Cookie machen, aber ich hoffe, es geht nicht um einen Kontostand.
Scott Stafford
Ich kann Ihnen versichern, dass es sich nicht um ein Bankguthaben handelte. Aber guter Punkt :)
Jonathan
2
Wenn wie in diesem Fall jeder diese Domäne mit seinem eigenen Parameter aufrufen kann, können Sie die Sicherheit erhöhen, indem Sie einen weiteren Parameter hinzufügen. Erstellen Sie einen Hash mit den Daten und einem zusätzlichen Salt und übergeben Sie ihn als Parameter. Überprüfen Sie in Ihrer cookie.php einfach die Daten in $ _GET ['val'], indem Sie das Token neu erstellen und vergleichen.
Seba M
Wenn Sie das GET auf diese Weise senden, können Sie auch AJAX verwenden.
user10398534
18

Wahrscheinlich können Sie Iframedafür verwenden. Facebook verwendet diese Technik wahrscheinlich. Mehr dazu lesen Sie hier . Stackoverflow verwendet eine ähnliche Technik, aber mit lokalem HTML5-Speicher mehr dazu in ihrem Blog

Ondrej Bozek
quelle
1
iframe funktionierte perfekt für meine Lösung,
Joel Davis
Beachten Sie, dass Ihr Access-Control-Allow-Origin ordnungsgemäß konfiguriert sein muss, damit dies funktioniert.
user10398534
6

Das Setzen von Cookies für eine andere Domain ist nicht möglich.

Wenn Sie Daten an eine andere Domain übergeben möchten, können Sie diese in die URL kodieren.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
quelle
5
Das Setzen eines Sitzungscookies aus einer URL ist ein Sicherheitsrisiko. URLs werden normalerweise protokolliert und ermöglichen es einem Angreifer, eine Benutzersitzung zu stehlen
Dane Macaulay
6

Sie können nicht, zumindest nicht direkt. Das wäre ein böses Sicherheitsrisiko.

Während Sie ein Domain-Attribut angeben können , die Spezifikation sagt : „Der User - Agent Cookies ablehnen wird , wenn das Domain - Attribut einen Bereich für den Cookie gibt, die die Ursprungsserver umfassen würden.“

Da der Ursprungsserver ist a.comund dies nicht beinhaltet b.com, kann er nicht festgelegt werden.

Sie müssten b.comstattdessen den Cookie setzen. Sie können dies beispielsweise über HTTP-Weiterleitungen zu b.comund zurück tun .

QUentin
quelle
Ich weiß, dass dies eine alte Antwort ist, aber warum sollte dies ein Sicherheitsrisiko sein? Sie können Cookies in Ihrer Konsole oder in einer Erweiterung setzen? Warum ist es wichtig, wenn Sie ein Cookie für eine andere Domain setzen können?
Timberman
1
@ Timberman - Die Frage bezieht sich auf JavaScript, das auf einer Website ausgeführt wird, die nicht in den Entwicklertools und nicht in einer explizit installierten Erweiterung enthalten ist. Dies wäre ein Sicherheitsrisiko, da jeder Besucher evil-hack.com , der ein Cookie dafür setzen könnte, seine Einstellungen their-favourite-website.comauf dieser Website ändern würde.
Quentin
Ich verstehe das, aber wie ist es ein Sicherheitsrisiko? Ich bin mir ziemlich sicher, dass es in Bezug auf die Sicherheit nichts zu tun gibt.
Timberman
@ Timberman - Wenn Sie kein Problem damit sehen können, dass die Site eines Angreifers Ihre Einstellungen für eine völlig andere Site ändert, weiß ich nicht, wie ich es klarer erklären soll.
Quentin
Ich sehe das Problem, aber ich sehe nicht, wie es ein Sicherheitsrisiko ist. Ich stimme Ihnen zu, dass Javascript kein Cookie für eine andere Domain setzen kann, aber wie ist es ein Sicherheitsproblem, wenn es möglich ist?
Timberman
5

Falls Sie haben a.my-company.com und b.my-company.comstatt nur a.comund b.comSie können ein Cookie für Ausgabe von .my-company.comDomain - es wird angenommen und sowohl der Domänen gesendet werden.

Stop-Cran
quelle
1
Ist es möglich, in a.my-company.com ein Cookie für b.my-company.com zu erstellen?
Mahesh Kajale
1
Es sei denn, my-company.com befindet sich in der Black-Hole-Liste für öffentliche Suffixe. In diesem Fall ignoriert der Browser alle Versuche, das Cookie zu setzen, stillschweigend! : '- (
Michael
5

siehe RFC6265 :

Der Benutzeragent lehnt Cookies ab, es sei denn, das Domain-Attribut gibt einen Bereich für das Cookie an, der den Ursprungsserver enthalten würde. Beispielsweise akzeptiert der Benutzeragent ein Cookie mit dem Domain-Attribut "example.com" oder "foo.example.com" von foo.example.com, der Benutzeragent akzeptiert jedoch kein Cookie mit dem Domain-Attribut " "bar.example.com" oder "baz.foo.example.com".

ANMERKUNG: Aus Sicherheitsgründen sind viele Benutzeragenten so konfiguriert, dass sie Domänenattribute ablehnen, die "öffentlichen Suffixen" entsprechen. Beispielsweise lehnen einige Benutzeragenten die Domänenattribute "com" oder "co.uk" ab. (Weitere Informationen finden Sie in Abschnitt 5.3.)

Die oben erwähnte Problemumgehung mit image / iframe funktioniert jedoch, obwohl sie aufgrund ihrer Unsicherheit nicht empfohlen wird.

Roy Ling
quelle
1

Sie können nicht, aber ... Wenn Sie beide Seiten besitzen, dann ...

1) Sie können die Daten über Abfrageparameter ( http://siteB.com/?key=value ) senden )

2) Sie können einen Iframe von Site B innerhalb von Site A erstellen und Post-Nachrichten von einem Ort zum anderen senden. Da Site B Eigentümer von Site B-Cookies ist, kann sie durch Verarbeitung der richtigen Post-Nachricht den gewünschten Wert festlegen. (Sie sollten verhindern, dass andere unerwünschte Absender Nachrichten an Sie senden. Dies liegt bei Ihnen und dem Mechanismus, den Sie verwenden, um dies zu verhindern.)

cSn
quelle
0

In diesem Link finden wir die Lösung Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Hariharan AR
quelle
1
Das wird nicht funktionieren. Siehe die Spezifikation : "Der Benutzeragent lehnt Cookies ab, es sei denn, das Domain-Attribut gibt einen Bereich für das Cookie an, der den Ursprungsserver enthalten würde."
Quentin
0

Senden einer POST-Anfrage von A. Post-Anfragen befinden sich nur auf der Serverseite und können vom Client nicht aufgerufen werden.

Sie können eine POST-Anfrage a.coman b.comCURL (empfohlen, serverseitig) oder eine versteckte sendenmethod="POST" Formular (clientseitig) senden. Wenn Sie sich für Letzteres entscheiden, möchten Sie möglicherweise Ihr JavaScript verschleiern, damit der Benutzer den Algorithmus nicht verstehen und ihn nicht stören kann.

Erstellen Sie ein Gateway b.comzum Setzen von Cookies:

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

Wenn Sie die Sicherheit noch weiter verbessern möchten, implementieren Sie auf beiden Seiten ( a.comund b.com) eine Funktion zum Verschlüsseln (Ein a.com) und Entschlüsseln (Ein b.com) von Daten mithilfe einer kryptografischen Chiffre.

Wenn Sie versuchen, etwas zu tun, das absolut sicher sein muss (z. B. eine Anmeldesitzung übertragen), versuchen Sie es mit oAuth oder lassen Sie sich von https://api.cloudianos.com/docs#v2/auth inspirieren

user10398534
quelle
0

Folgendes habe ich verwendet. Beachten Sie, dass dieses Cookie offen (http) übergeben wird und daher unsicher ist. Ich benutze es nicht für etwas, das Sicherheit erfordert.

  1. Site A generiert ein Token und wird als URL-Parameter an Site B übergeben.
  2. Site B nimmt das Token und setzt es als Sitzungscookie.

Sie könnten wahrscheinlich Verschlüsselung / Signaturen hinzufügen, um dies sicher zu machen. Recherchiere, wie das richtig geht.

thebiggestlebowski
quelle