Come impostare un cookie per un altro dominio


166

Supponiamo di avere un sito Web chiamato a.come quando viene caricata una pagina specifica di questo sito, ad esempio il collegamento alla pagina, mi piace impostare un cookie per un altro sito chiamato b.com, quindi reindirizzare l'utente a b.com.

Voglio dire, a carico di a.com/linkvoglio impostare un cookie per b.come reindirizzare l'utente a b.com.

L'ho testato e il browser ha effettivamente ricevuto il cookie da a.com/link, ma non ha inviato quel cookie sulla richiesta di reindirizzamento a b.com. È normale?

Possiamo impostare i cookie per altri domini?


Tieni presente che se usi i parametri URL per impostare i cookie su b.com, chiunque potrebbe forzare qualsiasi valore dei cookie su b.com da qualsiasi sito Web.
Julien,

2
usa un iFrame di b.com che imposta un cookie;)
Jaquarh

Risposte:


129

Non è possibile impostare i cookie per un altro dominio. Consentire ciò comporterebbe un enorme difetto di sicurezza.

È necessario ottenere b.com per impostare il cookie. Se a.com reindirizza l'utente ab.com/setcookie.php?c=value

Lo script setcookie potrebbe contenere quanto segue per impostare il cookie e reindirizzare alla pagina corretta su b.com

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

Tuttavia a.com può inserire gli stessi dati sotto forma di intestazione quando reindirizza a b.com, non è vero? Perché questo non presenta un difetto di sicurezza?
Coder

3
@Coder, la funzione setcookie comporterà l'invio di un'intestazione di cookie al browser da b.com. a.com non è in grado di inviare un'intestazione di cookie da b.com.
qbert220,

sì, questo è molto insicuro, ma funziona. Se l'OP possiede a.com e b.com e il cookie è piuttosto banale, allora forse va bene.
rocketsarefast,

1
è meglio notare nella risposta che questo è insicuro sebbene funzioni.
Roy Ling

2
come puoi dirlo, tuttavia YouTube sta leggendo i cookie creati da Gmail per mostrare il proprio account su YouTube?
TAHA SULTAN TEMURI

55

Simile alla risposta principale, ma invece di reindirizzare alla pagina e viceversa, il che causerà una brutta esperienza utente, puoi impostare un'immagine sul dominio A.

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

E poi sul dominio B che è example.com in cookie.php avrai il seguente codice:

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

Hattip a Subin


1
bel trucco ... :)
dal

16
Attenzione, probabilmente è una pessima idea. Stai aggirando le protezioni dei cookie molto intenzionali, fondamentalmente lasciando che chiunque invii una richiesta GET predisposta per impostare quel cookie su qualsiasi valore desideri. Non so cosa farai allora con quel cookie, ma spero che non comporti un saldo bancario.
Scott Stafford

Posso assicurarti che non comportava un saldo bancario. Ma buon punto :)
Jonathan,

2
Se come in questo caso tutti possono chiamare questo dominio con i propri parametri, è possibile aggiungere sicurezza aggiungendo un altro parametro. Crea un hash con i dati e un ulteriore salt e passalo come parametro. Nel tuo cookie.php verifica semplicemente i dati in $ _GET ['val'], ricreando il token e confrontandoli.
Seba M

Se stai inviando il GET in questo modo, puoi anche usare AJAX.
user10398534

18

Probaly puoi usare Iframe per questo. Facebook probabilmente utilizza questa tecnica. Puoi leggere di più su questo qui . Stackoverflow utilizza una tecnica simile, ma con l'archiviazione locale HTML5, più su questo sul loro blog


1
iframe ha funzionato perfettamente per la mia soluzione, includi semplicemente i valori nell'URL come una normale richiesta get e rispondi dal server con i valori dei cookie
Joel Davis,

Tieni presente che è necessario che Access-Control-Allow-Origin sia configurato correttamente affinché funzioni.
user10398534

6

L'impostazione dei cookie per un altro dominio non è possibile.

Se desideri trasferire i dati a un altro dominio, puoi codificarli nell'URL.

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

4
l'impostazione di un cookie di sessione da un URL è un rischio per la sicurezza. gli URL sono generalmente registrati e consentirebbero a un utente malintenzionato di rubare una sessione utente
Dane Macaulay,

6

Non puoi, almeno non direttamente. Sarebbe un brutto rischio per la sicurezza.

Mentre è possibile specificare un attributo Dominio , la specifica dice "L'agente utente rifiuterà i cookie a meno che l'attributo Dominio non specifichi un ambito per il cookie che includa il server di origine".

Poiché il server di origine è a.come non include b.com, non può essere impostato.

Dovresti b.cominvece impostare il cookie. È possibile farlo tramite (ad esempio) reindirizzamenti HTTP da b.come verso.


So che questa è una vecchia risposta, ma perché sarebbe un rischio per la sicurezza? Puoi impostare i cookie nella tua console o in estensione? Perché dovrebbe importare se è possibile impostare un cookie per un dominio diverso?
Timberman

@Timberman - La domanda riguarda JavaScript in esecuzione su un sito Web non negli strumenti di sviluppo e non in un'estensione esplicitamente installata. Sarebbe un rischio per la sicurezza perché chiunque visiti evil-hack.com potrebbe avere un cookie impostato their-favourite-website.comche cambierebbe le sue preferenze su quel sito web.
Quentin,

Lo capisco, ma come è un rischio per la sicurezza? Sono abbastanza sicuro che non abbia nulla a che fare con la sicurezza?
Timberman

@Timberman - Se non riesci a vedere un problema con il sito di un utente malintenzionato che modifica le tue preferenze per un sito completamente diverso, non so come spiegarlo più chiaramente.
Quentin,

Vedo il problema, ma non vedo come sia un rischio per la sicurezza. Sono d'accordo con te sul fatto che JavaScript non dovrebbe essere in grado di impostare un cookie per un dominio diverso, ma come può essere un problema di sicurezza se fosse in grado di farlo?
Timberman

5

Nel caso in cui tu abbia a.my-company.come b.my-company.cominvece che solo a.come b.comtu possa emettere un cookie per il .my-company.comdominio, questo verrà accettato e inviato a entrambi i domini.


1
è possibile creare un cookie in a.my-company.com per b.my-company.com?
Mahesh Kajale,

1
A meno che my-company.com non sia nell'elenco dei buchi neri del suffisso pubblico, nel qual caso il browser ignorerà silenziosamente tutti i tentativi di impostazione del cookie! : '- (
Michael,

5

vedi RFC6265 :

L'agente utente rifiuterà i cookie a meno che l'attributo Dominio non specifichi un ambito per il cookie che includa il server di origine. Ad esempio, l'agente utente accetterà un cookie con un attributo Dominio di "esempio.com" o di "foo.example.com" da foo.example.com, ma l'agente utente non accetterà un cookie con un attributo Dominio di "bar.example.com" o di "baz.foo.example.com".

NOTA: per motivi di sicurezza, molti programmi utente sono configurati per rifiutare gli attributi di dominio che corrispondono a "suffissi pubblici". Ad esempio, alcuni programmi utente rifiuteranno gli attributi di dominio di "com" o "co.uk". (Vedere la Sezione 5.3 per ulteriori informazioni.)

Ma la soluzione sopra menzionata con image / iframe funziona, anche se non è consigliata a causa della sua insicurezza.


1

Non puoi, ma ... Se possiedi entrambe le pagine, allora ...

1) È possibile inviare i dati tramite parametri di query ( http://siteB.com/?key=value )

2) Puoi creare un iframe del sito B all'interno del sito A e puoi inviare messaggi postali da una posizione all'altra. Poiché il sito B è il proprietario dei cookie del sito B, sarà in grado di impostare qualsiasi valore sia necessario elaborando il messaggio postale corretto. (Dovresti impedire ad altri mittenti indesiderati di inviarti messaggi! Dipende da te e dal meccanismo che decidi di utilizzare per evitare che ciò accada)


0

In questo link, troveremo la soluzione Link .

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

1
Non funzionerà Vedere la specifica : "L'agente utente rifiuterà i cookie a meno che l'attributo Dominio non specifichi un ambito per il cookie che includa il server di origine."
Quentin,

0

Invia una richiesta POST da A. Le richieste di posta sono solo sul lato server e non sono accessibili dal client.

È possibile inviare una richiesta POST da a.coma b.comutilizzando CURL (consigliato, lato server) o nascostomethod="POST" modulo ( ). Se scegli quest'ultimo, potresti voler offuscare il tuo JavaScript in modo che l'utente non sia in grado di capire l'algoritmo e interferire con esso.

Crea un gateway b.comper impostare i cookie:

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

Se si desidera migliorare ulteriormente la sicurezza, implementare una funzione su entrambi i lati ( a.come b.com) per crittografare (on a.com) e decrittografare (onb.com ) i dati utilizzando un crittografo crittografico.

Se stai provando a fare qualcosa che deve essere assolutamente sicuro (es. Trasferire una sessione di accesso) prova oAuth o prendi ispirazione da https://api.cloudianos.com/docs#v2/auth

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.