Obtenir des cookies de configuration sur différents domaines, avec javascript ou autre
-
03-07-2019 - |
Question
N'ayant pas pu trouver quoi que ce soit de particulier à cette situation en ligne, alors j'y vais ... Je dois configurer / obtenir les cookies stockés sur " first.com " en naviguant sur " second.com &,, j'ai un accès complet à " first.com " mais je n’ai qu’un accès javascript (je peux manipuler le DOM comme je le souhaite) sur "second.com".
Ma première approche consistait à créer un iframe sur second.com (avec js) qui chargeait une page du type "first.com/doAjax? setCookie = xxx". et cela a fait un appel ajax pour dire "first.com/setCookie? cookieData = xxx". qui placerait le cookie sur " first.com " avec les données que nous avons transmises.
Cela a très bien fonctionné pour définir le cookie sur first.com de second.com. Pour obtenir un cookie, j'ai essentiellement suivi la même procédure, créé l'iframe qui a chargé "first.com/doAjax? getCookie". et cela ferait un appel ajax pour dire " first.com/getCookie" qui lirait les informations de cookie sur first.com et les renverrait en tant qu’objet JSON.
Le problème est que je ne parviens pas à ramener cet objet cookie JSON à "second.com". pour que je puisse le lire, eh bien, je pourrais peut-être le rapporter une fois l’appel Ajax terminé avec "window.top". mais il y a des problèmes de synchronisation car ce n'est pas relatif au moment où l'iframe a été chargé. J'espère que je suis clair et que je me demandais s'il existait une solution plus simple plutôt que cette merde d'iframe - > ajax, semble également que cela ne fonctionnerait même pas pour obtenir des cookies dans SAFARI.
La solution
Vous pouvez injecter un élément de script dans HEAD du document avec un rappel qui transmet le cookie nécessaire à la fonction qui en a besoin.
Quelque chose comme:
<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>
Et la page first.com/doAjax?getCookie pourrait le faire:
passCookie({'name':'mycookie', 'value':'myvalue'});
Autres conseils
Placez ce fichier PHP sur first.com:
//readcookie.php
echo Placez ce fichier PHP sur first.com:
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();
}
Sur second.com, vous pouvez utiliser ce javascript pour obtenir la valeur:
<*>
Cordialement,
Robert
COOKIE['cookiename'];
Sur second.com, vous pouvez utiliser ce javascript pour obtenir la valeur:
<*>Cordialement, Robert
Pour les cookies de configuration, vous pouvez modifier mon script comme suit:
Le nouveau script PHP:
//writecookie.php
setcookie( Pour les cookies de configuration, vous pouvez modifier mon script comme suit:
Le nouveau script PHP:
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();
}
Et le JavaScript:
<*>
Cela devrait fonctionner sur tous les navigateurs.
GET['c'], Pour les cookies de configuration, vous pouvez modifier mon script comme suit:
Le nouveau script PHP:
<*>
Et le JavaScript:
<*>
Cela devrait fonctionner sur tous les navigateurs.
GET['v']);
Et le JavaScript:
<*>Cela devrait fonctionner sur tous les navigateurs.