2008-12-31 3 views
22

Ich konnte nichts bestimmtes zu dieser Situation online finden, also hier gehe ich ... Ich muss setzen/erhalten die Cookies auf "first.com" gespeichert Beim Durchsuchen von "second.com" habe ich vollen Zugriff auf "first.com", aber ich habe nur JavaScript-Zugriff (kann das DOM so manipulieren, wie ich möchte) auf "second.com".Setzen von Cookies auf verschiedenen Domänen, mit Javascript oder anderen

Meine erste Annäherung war, einen iframe auf second.com (mit js) zu verursachen, das eine Seite wie "first.com/doAjax?setCookie=xxx" lud und das einen Ajaxanruf tat, um "first.com/setCookie zu sagen ? cookieData = xxx ", die den Cookie auf" first.com "mit den Daten setzen würde, die wir weitergegeben haben.

Das hat ziemlich gut funktioniert, um den Cookie auf first.com von second.com zu setzen - um einen Cookie zu bekommen, habe ich im Prinzip die gleiche Prozedur ausgeführt, den iframe erstellt, der "first.com/doAjax?getCookie" geladen hat und das würde Führen Sie einen Ajax-Aufruf aus, um "first.com/getCookie" zu sagen, der die Cookie-Informationen auf first.com liest und als JSON-Objekt zurückgibt.

Das Problem ist, dass ich dieses JSON-Cookie-Objekt nicht zurück zu "second.com" bringen kann, damit ich es lesen kann, naja, vielleicht könnte ich es nur bringen, wenn der Ajax-Aufruf mit "window.top" abgeschlossen ist Aber es gibt Timing-Probleme, weil es nicht relativ ist, wenn der Iframe geladen wurde. Ich hoffe ich bin klar und habe mich gefragt, ob es eine einfachere Lösung als diesen verrückten iframe-> ajax-Mist gibt, scheint auch nicht zu funktionieren, um Cookies in SAFARI zu bekommen.

+0

Nur ein Hinweis, dass dies wirklich unsicher ist, da jeder Cookies für first.com setzen und bekommen kann. –

+0

@Luca Und wenn der Benutzer Cookies von Drittanbietern deaktiviert hat, können Sie den Cookie nicht im iframe setzen an erster Stelle. – Pacerier

Antwort

9

Sie könnten ein Script-Element in HEAD des Dokuments mit einem Callback einfügen, das den benötigten Cookie an die von Ihnen benötigte Funktion weiterleitet.

Etwas wie:

<script type="text/javascript"> 
    var newfile=document.createElement('script'); 
    newfile.setAttribute("type","text/javascript"); 
    newfile.setAttribute("src", 'http://first.com/doAjax?getCookie&callback=passCookie'); 
    document.getElementsByTagName("head")[0].appendChild(newfile); 
</script> 

Und die Seite first.com/doAjax?getCookie könnte dies tun:

 passCookie({'name':'mycookie', 'value':'myvalue'}); 
+3

Anscheinend funktioniert diese Methode nur in Firefox, ich habe es in Safari und IE6 getestet, beide konnten keine Cookies setzen/bekommen ... –

+0

Ich kann das Skript-Tag nicht benutzen, um Cookies von einer anderen Domain zu lesen, oder? Ich muss tatsächlich auf first.com sein, um wirklich seine Plätzchen zu lesen, ich kann gerade einen Indextag zu second.com hinzufügen, um die cookieData zu erhalten ... deshalb muss ich einen iframe verwenden, oder ich weiß nicht ... Vielleicht ich habe deine Antwort nicht verstanden, lass es mich wissen. –

+0

Sie verwenden technisch kein Skript-Tag, um die Cookie-Werte zu lesen, das Skript ist in Ihrer Seite enthalten, daher ist es im gleichen Umfang und kann jede Funktion auf second.com aufrufen –

0

Diese PHP-Datei first.com:

//readcookie.php  
echo $_COOKIE['cookiename']; 

Auf second.com können Sie diesen Javascript verwenden, um den Wert zu erhalten:

function readCookieCallback() 
{ 
    if ((this.readyState == 4) && (this.status == 200)) 
    { 
    alert("the value of the cookie is: "+this.responseText); 
    } 
    else if ((this.readyState == 4) && (this.status != 200)) 
    { 
    //error... 
    } 
} 


function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.onreadystatechange = readCookieCallback; 
    refreshObject.open("GET", "http://www.first.com/readcookie.php"); 
    refreshObject.send(); 
} 

Grüße, Robert

+0

Imstande, mit der von Ryan Doherty bereitgestellten Methode Cookies zu erhalten, sieht es so aus, als ob es Cookies auf den meisten Browser außer Safari setzt. –

+1

Das hat bei mir nicht funktioniert. Ich habe die Antwort in Chrome erhalten: XMLHttpRequest kann https://second.com/test.php nicht laden. Ursprung https://first.com ist nicht von Access-Control-Allow-Origin erlaubt. – Volomike

+0

Das ist ein CORS-Problem. Ohne Bezug zum Cookie-Problem. – germs12

-2

Für Cookies einstellen Sie können mein Skript wie folgt ändern:

Die neue PHP-Script:

//writecookie.php 
setcookie($_GET['c'], $_GET['v']); 

Und das JavaScript:

function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.open("GET", "http://www.first.com/writecookie.php?c=cookiename&v=cookievalue"); 
    refreshObject.send(); 
} 

Das sollte auf allen Browsern funktionieren.

+4

Nein, Ajax-Aufrufe sind nicht erlaubt Cross-Domain ... –

+0

@LucaMatteis ... solange CORS (http://dev.w3.org/2006/waf/access-control/) nicht aktiviert ist. – Stephan