2011-02-05 12 views
7

Voglio creare un cookie da un dominio una volta che l'utente è registrato in PHP. e rendere questo cookie accessibile a 4 altri domini non sottodominio. So che i cookie non sono progettati per essere accessibili per altri domini. Ad esempio, ho impostato una variabile di cookie $ user_email dal dominio www.firstdomain.com e desidero accedervi in ​​altri domini come www.seconddomain.com, www.thirddomain.com ecc. Può essere fatto utilizzando PHP o JavaScript. Qualche idea per favore.Cookie PHP per domini multipli

Grazie!

risposta

6

Come già detto, un cookie può essere impostato solo per un dominio da quel dominio (inclusi i suoi sottodomini). E se i tuoi domini non condividono un superdominio comune, devi impostare separatamente ciascun cookie per ciascun dominio.

È possibile eseguire questa operazione con uno script che in ogni dominio che imposta i cookie per voi. Assicurati però di autenticare le richieste di questi script in modo che solo tu possa impostare i cookie.

+0

Penso che questo articolo spieghi in modo abbastanza sintetico: http://www.codeguru.com/csharp/csharp/cs_internet/article.php/c19417/Sharing-Cookies-Across-Domains.htm – peteski

1

Avevo risolto esattamente lo stesso problema (in realtà anche per 4 domini). L'unica soluzione che ho trovato è stata quella di includere 3 iframe nascosti nella "Pagina di accesso di successo" e quegli iframe caricano semplicemente www.domain1.com/register_session.php, www.domain2.com/register_session.php, ecc. ...

come parametro per register_session.php io uso 'sid', che contiene l'ID di sessione:

session_id($_GET['sid']); 
session_start(); 

Questo è in realtà per mantenere in vita sessione su tutti i domini, ma lo stesso potrebbe essere per il vostro caso con i biscotti

+0

In alternativa, si può solo fare una richiesta AJAX cross-origine tramite [CORS] (http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -origin-resource-sharing /) per passare le informazioni attraverso i domini. –

9

Durante la ricerca l'elenco dei cookie per cookie validi, un confronto tra i attributi dominio del cookie è realizzato con il nome di dominio Internet di l'host da cui l'URL sarà inverosimile. Se è presente una corrispondenza di coda, , il cookie passerà attraverso il percorso corrispondente per verificare se è necessario inviarlo. "Tail matching" significa che l'attributo dominio è abbinato alla coda del nome di dominio completo di dell'host. Un attributo dominio di "acme.com" corrisponderebbe ai nomi host "anvil.acme.com" e a "shipping.crate.acme.com". Solo gli host all'interno del dominio specificato possono impostare un cookie per un dominio e domini devono avere almeno due (2) o tre (3) periodi per impedire domini di il modulo: ".com", ". edu "e" va.us ". Qualsiasi dominio che non riesce entro uno dei domini speciali di primo livello elencati di seguito richiede solo due periodi. Qualsiasi altro dominio richiede almeno tre. I sette domini speciali speciali sono: "COM", "EDU", "NET", "ORG", "GOV", "MIL" e "INT".

Il valore predefinito del dominio è il nome host del server che ha generato la risposta del cookie.

leggere here.

è possibile caricare un iframe da un host che quindi si ricarica con il valore del cookie codificato nella parte del segmento (dopo il #).

è quindi possibile accedere all'attributo document.location dalla finestra padre (fa clic sull'unica cosa accessibile). decodificarlo e passarlo al tuo server facendo una richiesta Ajax.

Questo potrebbe sembrare così.

xss.php (situato su cookie.esempio.com):

<?php 
$data = array(
'uid' => $_COOKIE['uid'], 
'loginhash' => $_COOKIE['loginhash']); 
header('Location: xss.php#'.urlencode(json_encode($data))); 

per questo caso particolare non deve essere l'hashtag! è appena conveniente per altre situazioni. questo può essere fatto anche in javascript.

un altro sito incorpora xss.php:

<iframe id="cookies" src="http://cookies.example.com/xss.php"></iframe> 

you need to somehow delay the following of do it in a loop that stops after 5 seconds or something. 

if(document.getElementById('cookies').location != 'http://cookies.example.com/xss.php') { 
// read location, extract hashtag, json decode using javscript, there you have your user. send it to server for validation or whatever. 
} 

questo teqnique è chiamato XSS recieving. è ad esempio utilizzato da Facebook per tutte le loro librerie di connessione javascript.

un modo probabilmente migliore sarebbe una sorta di protocollo di scambio di token come openid.

amazon usa anche questo.

è possibile impostare un provider openid (sono disponibili librerie che possono farlo immediatamente) e impostarlo per reindirizzare auotmaticamente indietro senza l'interazione dell'utente. Ho visto spesso il protocollo openid utilizzato per altri scopi, proprio come la comunicazione cross-domain.

+0

Puoi modificare la tua risposta (magari dare un pezzo di codice di esempio) in modo da poterti rilanciare? Ho accidentalmente annullato il mio voto. –

+0

in arrivo. –

+0

Penso che possa essere fatto in un modo più elegante ma il principio rimane lo stesso –

1

Io ho fatto alcuni script per gestire più cookie di dominio:

https://code.google.com/p/mudoco/

+0

Molto bello, Andando a dargli un vortice più tardi oggi, butta questo su GitHub e io contribuirò –

0

se si desidera accedere biscotto all'interno di diversi domini per cui questo può essere fatto con l'aiuto di javascript trucco. Poiché è possibile accedere ai cookie all'interno dello stesso dominio.

  1. Crea cookie sul browser dell'utente utilizzando JavaScript sul tuo primo dominio.

  2. Impostare il nome della finestra sul valore del cookie che si desidera trasferire in un altro dominio utilizzando window.name.

  3. Il passaggio 2 deve essere eseguito su ogni pagina del dominio che ha creato il cookie. Potrebbe essere facilmente chiamando un file JavaScript su tutte le pagine.

  4. Quando ci si sposta in un altro dominio e si desidera accedere al valore del cookie sopra menzionato, accedervi utilizzando window.name come window non modificato.

  5. Crea un nuovo cookie su questo dominio e assegna questo valore ad esso.