Comment les cookies HttpOnly fonctionnent-ils avec les requêtes AJAX?

JavaScript a besoin d'un accès aux cookies si AJAX est utilisé sur un site avec des restrictions d'accès basées sur les cookies. Les cookies HttpOnly fonctionneront-ils sur un site AJAX?

Edit: Microsoft a créé un moyen de prévenir les attaques XSS en interdisant L'accès JavaScript aux cookies si HttpOnly est spécifié. FireFox l'a adopté plus tard. Donc ma question est: si vous utilisez AJAX sur un site, comme StackOverflow, les cookies Http sont-ils une option?

Edit 2: Question 2. Si le but de HttpOnly est D'empêcher L'accès JavaScript aux cookies, et que vous pouvez toujours récupérer les cookies via JavaScript via L'objet XmlHttpRequest, Quel est l'intérêt de HttpOnly ?

Edit 3: Voici une citation de Wikipedia:

Lorsque le navigateur reçoit un cookie, il est censé l'utiliser comme d'habitude dans la suivre les échanges HTTP, mais pas pour le rendre visible aux scripts côté client.[32] l'indicateur HttpOnly ne fait partie d'aucune norme et n'est pas mis en œuvre dans tous les navigateurs. Notez qu'il n'y a actuellement aucun empêchement de lire ou d'écrire le cookie de session via une XMLHTTPRequest. [33].

je comprends que document.cookie est bloqué lorsque vous utilisez HttpOnly. Mais il semble que vous puissiez toujours lire les valeurs des cookies dans L'objet XMLHttpRequest, en autorisant XSS. Comment est-ce que Httpon seulement vous rend plus sûr que? En faisant des cookies essentiellement en lecture seule?

dans votre exemple, Je ne peux pas écrire à votre document.cookie , mais je peux quand même voler votre cookie et le poster dans mon domaine en utilisant L'objet XMLHttpRequest.

<script type="text/javascript">
    var req = null;
    try { req = new XMLHttpRequest(); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    req.open('GET', 'http://stackoverflow.com/', false);
    req.send(null);
    alert(req.getAllResponseHeaders());
</script>

Edit 4: Désolé, je voulais dire que vous pouvez envoyer à la XMLHttpRequest pour la StackOverflow domaine, puis enregistrer le résultat de getAllResponseHeaders() pour une chaîne regex l' cookie, et puis après, qu'à un domaine externe. Il semble que Wikipedia et ha.ckers d'accord avec moi sur ce point, mais j'aimerais être rééduqués...

montage Final: Ahh, apparemment, les deux sites sont des faux, c'est en fait un bug dans FireFox . IE6 & 7 sont en fait les seuls navigateurs qui prennent actuellement entièrement en charge HttpOnly.

pour réitérer tout ce que j'ai appris:

  • HttpOnly limite tous les accès au document.cookie dans IE7 et FireFox (je ne sais pas sur les autres navigateurs)
  • HttpOnly supprime les informations de cookie des en-têtes de réponse dans XMLHttpObject.getallresponseeheaders () in IE7.
  • Les objets XMLHttpObjects
  • ne peuvent être soumis qu'au domaine d'où ils proviennent, de sorte qu'il n'y a pas d'affichage transversal des cookies.

modifier: cette information est probablement non plus à jour.

179
demandé sur Shawn 2008-08-26 17:06:14

9 réponses

Oui, les cookies HTTP seulement seraient très bien pour cette fonctionnalité. Ils seront toujours fournis avec la requête XmlHttpRequest au serveur.

dans le cas d'un débordement de pile, les cookies sont automatiquement fournis dans le cadre de la requête XmlHttpRequest. Je ne connais pas les détails de la mise en œuvre du fournisseur D'authentification Stack Overflow, mais les données des cookies sont probablement utilisées automatiquement pour vérifier votre identité à un niveau inférieur à celui du contrôleur "vote". méthode.

plus généralement, les cookies sont et non requis pour AJAX. La prise en charge de XmlHttpRequest (ou même de remotting iframe, sur des navigateurs plus anciens) est tout ce qui est techniquement nécessaire.

cependant, si vous voulez fournir une sécurité pour la fonctionnalité activée AJAX, alors les mêmes règles s'appliquent que pour les sites traditionnels. Vous avez besoin d'une méthode d'identification de l'utilisateur derrière chaque demande, et les cookies sont presque toujours les moyens à cette fin.

dans votre exemple, Je ne peux pas écrire à votre document.cookie, mais je peux quand même voler votre cookie et le poster dans mon domaine en utilisant L'objet XMLHttpRequest.

XmlHttpRequest ne fera pas de requêtes inter-domaines (pour exactement le genre de raisons que vous abordez).

vous pouvez normalement injecter le script pour envoyer le cookie à votre domaine en utilisant iframe remoting ou JSONP, mais alors le HTTP protège seulement le cookie à nouveau car c'est inaccessible.

sauf si vous avez compromis StackOverflow.com du côté serveur, vous ne pourrez pas voler mon cookie.

Edit 2: Question 2. Si le but de Http-Only est d'empêcher L'accès JavaScript aux cookies, et que vous pouvez toujours récupérer les cookies via JavaScript via L'objet XmlHttpRequest, Quel est le but de Http-Only?

considérez ce scénario:

  • je trouve un moyen d'injecter du code JavaScript dans la page.
  • Jeff charge la page et mon JavaScript malveillant modifie son cookie pour correspondre au mien.
  • Jeff donne une excellente réponse à votre question.
  • parce qu'il le soumet avec mes données de cookie au lieu des siennes, la réponse deviendra la mienne.
  • Vous votez "mon" stellaire réponse.
  • mon vrai compte obtient le point.

avec des cookies HTTP seulement, la deuxième étape serait impossible, défiant ainsi ma tentative de XSS.

Edit 4: Désolé, je voulais dire que vous pouviez envoyer le XMLHttpRequest au domaine StackOverflow, puis Enregistrer le résultat de getallresponseeheaders() à une chaîne, regexer le cookie, et ensuite poster cela dans un domaine externe. Il semble que Wikipedia et ha.ckers d'accord avec moi sur ce point, mais je aimerais être rééduqués...

c'est exact. Vous pouvez toujours faire un détournement de session de cette façon. Cela réduit considérablement le nombre de personnes qui peuvent exécuter avec succès même ce piratage XSS contre vous.

cependant, si vous retournez à mon exemple de scénario, vous pouvez voir où HTTP-seulement fait couper avec succès les attaques XSS qui reposent sur la modification des cookies du client (pas rare).

il se résume au fait que a) aucune amélioration unique ne résoudra tous vulnérabilités et b) aucun système ne jamais sera complètement sécurisé. HTTP seulement est un outil utile pour étayer contre XSS.

de même, même si la restriction de domaine croisé sur XmlHttpRequest n'est pas 100% efficace pour empêcher tous les exploits de XSS, vous ne rêveriez jamais de supprimer la restriction.

59
répondu Dave Ward 2010-03-21 22:32:37

pas nécessairement, cela dépend de ce que vous voulez faire. Pourrais-tu élaborer un peu? AJAX n'a pas besoin d'accéder aux cookies pour fonctionner, il peut faire des demandes sur son propre pour extraire des informations, la demande de page que L'appel AJAX fait pourrait accéder aux données de cookie et passer que le retour au script d'appel sans Javascript avoir à accéder directement aux cookies

4
répondu Glenn Slaven 2008-08-26 13:18:50

Oui, c'est une option viable pour un site Ajax. Les cookies d'authentification ne sont pas destinés à être manipulés par des scripts, mais sont simplement inclus par le navigateur sur toutes les requêtes HTTP faites au serveur.

Les Scripts

n'ont pas besoin de s'inquiéter de ce que dit le cookie de session - tant que vous êtes authentifié, toute requête adressée au serveur par un utilisateur ou par le script inclura les cookies appropriés. Le fait que les scripts ne peuvent pas eux-mêmes connaître contenu du cookie n'a pas d'importance.

pour tous les cookies qui sont utilisés à des fins autres que l'authentification, ils peuvent être configurés sans l'option HTTP only, si vous voulez que le script puisse les modifier ou les lire. Vous pouvez choisir et choisir les cookies qui devraient être HTTP seulement, ainsi par exemple tout ce qui n'est pas sensible comme les préférences de L'interface utilisateur (ordre de tri, panneau gauche d'effondrement ou pas) peut être partagé dans les cookies avec les scripts.

j'aime vraiment le HTTP seulement cookies - c'est l'une de ces extensions de navigateur propriétaire qui était une idée vraiment chouette.

3
répondu thomasrutter 2009-02-26 12:16:09

il y a un peu plus.

Ajax n'exige pas strictement des cookies, mais ils peuvent être utiles comme d'autres affiches l'ont mentionné. Marquer un cookie HTTPOnly pour le cacher des scripts ne fonctionne que partiellement, car tous les navigateurs ne le prennent pas en charge, mais aussi parce qu'il existe des solutions de contournement communes.

il est étrange que les en-têtes XMLHTTPresponse donnent le cookie, techniquement le serveur n'a pas à retourner le cookie avec la réponse. Une fois qu'il est fixé sur le client, il reste fixé jusqu'à expiration. Bien qu'il y ait des schémas dans lesquels le cookie est modifié avec chaque requête pour empêcher la réutilisation. Ainsi, vous pouvez être en mesure d'éviter cette solution en changeant le serveur pour ne pas fournir le cookie sur les réponses XMLHTTP.

en général cependant, je pense que HTTPOnly devrait être utilisé avec une certaine prudence. Il y a des attaques de scripts de sites croisés où un attaquant prend des dispositions pour qu'un utilisateur soumette une demande de type ajax provenant d'un autre site., en utilisant des formulaires postaux simples, sans L'utilisation de XMLHTTP, et le cookie encore actif de votre navigateur authentifierait la demande.

si vous voulez être sûr qu'une requête AJAX est authentifiée, la requête elle-même et les en-têtes HTTP doivent contenir le cookie. Par exemple, grâce à l'utilisation de scripts ou d'inputs cachés uniques. HTTPOnly ne ferait qu'entraver ça.

habituellement, la raison intéressante de vouloir HTTPOnly est d'empêcher le contenu de tiers inclus sur votre page Web de voler des cookies. Mais il y a de nombreuses raisons intéressantes d'être très prudent sur l'inclusion du contenu de tiers, et de le filtrer agressivement.

2
répondu davenpcj 2009-06-10 14:17:48

les Cookies sont traités automatiquement par le navigateur lorsque vous faites un appel AJAX, de sorte qu'il n'est pas nécessaire que votre Javascript pour jouer avec les cookies.

1
répondu pkchukiss 2008-08-26 13:26:39

par conséquent, je suppose que JavaScript a besoin d'accéder à vos cookies.

toutes les requêtes HTTP de votre navigateur transmettent vos informations de cookie pour le site en question. JavaScript peut configurer et lire les cookies. Les Cookies ne sont pas par définition requis pour les applications Ajax, mais ils sont nécessaires pour la plupart des applications web pour maintenir l'état de l'utilisateur.

la réponse formelle à votre question telle que formulée - " JavaScript a - t-il besoin d'accéder aux cookies si AJAX est utilisé?"- est donc "non". Pensez aux champs de recherche améliorés qui utilisent les requêtes Ajax pour fournir des options suggérées automatiquement, par exemple. Il n'est pas nécessaire de les informations de cookie dans ce cas.

1
répondu Polsonby 2008-08-26 13:31:37

comme clarification - du point de vue du serveur, la page qui est demandée par une requête AJAX n'est essentiellement pas différente d'une requête HTTP get standard faite par l'utilisateur en cliquant sur un lien. Toutes les propriétés normales de la requête: user-agent, ip, session, cookies, etc. sont transmises au serveur.

1
répondu Glenn Slaven 2008-08-26 13:31:41

non, la page que L'appel AJAX demande a accès à des cookies aussi et c'est ce qui vérifie si vous êtes connecté.

vous pouvez faire d'autres authentification avec le Javascript, mais je n'y croirais pas, je préfère toujours mettre n'importe quelle sorte de vérification d'authentification dans la fin.

0
répondu Glenn Slaven 2008-08-26 13:23:43

Oui, les cookies sont très utiles pour Ajax.

mettre l'authentification dans L'URL de la requête est une mauvaise pratique. Il y avait une nouvelle la semaine dernière à propos de l'obtention des clés d'authentification dans les URLs du cache google.

Non, il n'existe aucun moyen pour empêcher les attaques. Les navigateurs plus anciens permettent toujours un accès trivial aux cookies via javascript. Vous pouvez contourner http seulement, etc. Tout ce que tu trouves peut être contourné moyennant un effort suffisant. Le truc, c'est faire trop d'efforts pour en valoir la peine.

Si vous voulez rendre votre site plus sécurisé (il n'y a pas de sécurité) vous pouvez utiliser un cookie d'authentification qui expire. Ensuite, si le cookie est volé, l'attaquant doit utiliser avant qu'il expire. Si ce n'est pas le cas, vous avez une bonne indication qu'il y a une activité suspecte sur ce compte. Plus la fenêtre de temps est courte, mieux c'est pour la sécurité, mais plus elle est chargée sur votre serveur en générant et en maintenant les clés.

0
répondu Jay 2009-03-23 15:35:12