2010-11-24 38 views
3

(Note: Voir aussi la question connexe Can browsers react to Set-Cookie specified in headers in an XSS jquery.getJSON() request?)Est-ce que jQuery.getJSON peut mettre les cookies d'un domaine dans l'en-tête de la requête qu'il fait?

Je ne peux pas sembler mettre un cookie (dont le nom est mwLastWriteTime) dans l'en-tête de demande d'une opération de JSON. La demande elle-même est simple des tutoriels Freebase MQL, et il fonctionne bien autrement:

// Invoke mqlread and call the function below when it is done. 
// Adding callback=? to the URL makes jQuery do JSONP instead of XHR. 
jQuery.getJSON("http://api.sandbox-freebase.com/api/service/mqlread?callback=?", 
{query: JSON.stringify(envelope)}, // URL parameters 
displayResults);      // Callback function 

je l'avais espéré que je pourrais mettre ce cookie avec quelque chose le long des lignes de:

$.cookie('mwLastWriteTime', value, {domain: ".sandbox-freebase.com"}); 

Malheureusement, la recherche dans Firebug l'en-tête de requête sortante Je ne vois que:

Host api.sandbox-freebase.com 
User-Agent [...] 
Accept */* 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Referer [...] 

Mais si je ne précise pas le domaine (ou si je spécifie explicitement le domaine du site demandeur) Je peux obtenir mwLastWriteTime pour apparaître dans les en-têtes pour les demandes locales. Puisque le domaine .sandbox-freebase.com est propriétaire de ces cookies, ne devrait-il pas voyager avec le GET? Ou a-t-on besoin d'une solution de contournement de quelque sorte?

Mon code est tout JavaScript, et je voudrais mettre ce cookie, puis appeler le getJSON immédiatement après.

Répondre

5

Vous cannot set a cross-domain cookie, car cela ouvrirait le navigateur (et donc l'utilisateur) aux attaques XSS.

Pour citer le QuirksMode.org article que je référence ci-dessus:

S'il vous plaît noter que le but du domaine est de permettre des cookies pour traverser sous-domaines. Mon cookie ne sera pas lu par search.quirksmode.org parce que son domaine est www.quirksmode.org. Lorsque je définis le domaine sur quirksmode.org, le sous-domaine de recherche peut également lire le cookie. Je ne peux pas définir le domaine de cookies à un domaine Je ne suis pas dans, je ne peux pas faire le domaine www.microsoft.com. Seul quirksmode.org est autorisé, dans ce cas .

Si vous voulez faire une demande cross-site avec des valeurs de cookies, vous devrez mettre en place une procuration spéciale sur un serveur que vous contrôlez qui vous permettra de passer des valeurs à envoyer en tant que valeurs cookie (probablement via les paramètres POST). Vous devez également vous assurer que vous le sécurisez correctement, de peur que votre proxy ne devienne le moyen par lequel les informations privées de quelqu'un d'autre sont "libérées".

+2

La réponse du serveur, cependant, peut certainement définir un cookie. OMI, c'est juste quelque chose qui ne devrait pas être fait dans js, de toute façon. – zanlok

+0

Je me demande pourquoi il y a tellement de documents API qui ne mentionnent pas cela, et disent des choses comme "Utilisation de l'objet options, les cookies peuvent être définis avec plusieurs options telles que le domaine et/ou le chemin pour lequel le cookie devrait être disponible. date du cookie, et si le cookie doit être envoyé via HTTPS uniquement. "! http://code.google.com/p/cookies/wiki/Documentation – HostileFork

+0

@Hostile Fork - Parfois, c'est parce que l'auteur a pris connaissance des limites de XSS, et parfois, c'est parce que l'auteur ne sait pas. Je parierais le premier dans ce cas. –

0

Exécutez-vous tous vos tests via localhost? Utilisez-vous IE? Si tel est le cas, il appliquera sa propre marque d'exigences particulières en matière de sécurité et risque de faire tomber vos cookies. Ouvrez le violoneur et utilisez http://ipv4.fiddler pour le contourner. Si ce type de supercherie ne se passe pas (comme il semble que vous utilisez FireFox), il se peut également que vous ayez besoin de définir explicitement le domaine du cookie comme étant le même que celui de votre requête JSON. . Un navigateur n'enverra pas de cookies pour le domaine A à une requête au domaine B. Je ne suis pas sûr à 100% que ce soit le cas.

+0

Mon script est "live" sur un domaine .com, qui fait la demande de 'api.sandbox-freebase.com'.Si vous définissez explicitement le domaine sur celui sur lequel s'exécute le script, il passera le cookie aux requêtes locales, mais pas à sandbox-freebase. Et définir explicitement le domaine à sandbox-freebase ne fait apparaître le cookie nulle part (il est invisible au débogueur Firebug sur mon domaine, vraisemblablement parce qu'il n'a pas les privilèges pour le lire après qu'il a écrit ...?) – HostileFork

+0

Ils Je vous ai couvert en bas. –