Comment faire des cookies HttpOnly travailler avec des requêtes AJAX?
JavaScript besoin d'accéder à des cookies si l'AJAX est utilisé sur un site avec des restrictions d'accès basés sur les cookies. Sera des cookies HttpOnly travailler sur un site en AJAX?
Edit: Microsoft a créé un moyen pour empêcher les attaques XSS en interdisant les accès JavaScript pour les cookies si HttpOnly est spécifié. FireFox plus tard adopté le présent. Donc ma question est: Si vous êtes en utilisant AJAX sur un site, comme StackOverflow, sont Http Uniquement des cookies une option?
Edit 2: La Question 2. Si le but de HttpOnly est pour éviter le JavaScript accès aux cookies, et vous pouvez toujours récupérer les cookies par l'intermédiaire de JavaScript via l'Objet XmlHttpRequest, quel est le point 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 suivante HTTP échanges, mais de ne pas la rendre visible pour les scripts côté client.[32] Le
HttpOnly
drapeau ne fait partie d'aucun standard, et n'est pas mis en œuvre dans tous les navigateurs. Notez qu'il n'existe actuellement pas de la prévention de la lecture ou de l'écriture, le cookie de session par l'intermédiaire d'un XMLHTTPRequest. [33].
Je comprends que document.cookie
est bloqué lorsque vous utilisez HttpOnly. Mais il semble que vous pouvez toujours lire les valeurs de cookie dans l'objet XMLHttpRequest, permettant XSS. Comment HttpOnly vous rendre plus sûrs que? Par la fabrication de biscuits, essentiellement en lecture seule?
Dans votre exemple, je ne peux pas écrire à votre document.cookie
, mais je peux encore voler votre cookie et de le poster à 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 le cookie, et puis après, qu'à un domaine externe. Il semble que Wikipédia et ha.ckers d'accord avec moi sur ce point, mais j'aimerais être rééduqués...
Final Edit: Ahh, apparemment, les deux sites sont des faux, c'est en fait une bug dans FireFox. IE6 & 7 sont en fait les seuls navigateurs qui actuellement entièrement en charge HttpOnly.
À rappeler 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 de les en-têtes de réponse dans XMLHttpObject.getAllResponseHeaders() dans IE7.
- XMLHttpObjects ne peuvent être présentées pour le domaine de l'origine, donc il n'y a pas de contre-domaine de l'affichage de l'cookies.
edit: Cette information est probablement pas à jour.
- J'ai jeté votre exemple dans un script greasemonkey et il semble que FF n'affiche plus les cookies. L'excellence de la recherche et de l'exemple.
- Peut-être avec la Même Origine, vous ne pouvez pas faire une requête http à un domaine qui n'est pas le même que le script est en cours d'exécution; toutefois, je crois que vous pourriez facilement passer les cookies en redirigeant l'utilisateur vers une page à l'aide de la fenêtre.emplacement et de transmettre toutes les informations par le biais de paramètres de chaîne de requête.
- ne peut pas faire une requête http à un domaine qui n'est pas le même que le script est en cours d'exécution dans" dites-vous qu'un site X ne peut pas inclure une image à partir de l'hôte Y? (une fonctionnalité qui a été pris en charge par tous les navigateurs depuis Mosaïque?)
Vous devez vous connecter pour publier un commentaire.
Oui, HTTP Uniquement les cookies serait parfait pour cette fonctionnalité. Ils seront toujours fournis avec le XmlHttpRequest la demande au serveur.
Dans le cas de Dépassement de la Pile, les cookies sont automatiquement fournis dans le cadre de la requête XmlHttpRequest. Je ne connais pas les détails de mise en œuvre de l'Débordement de Pile fournisseur d'authentification, mais que les données de cookie est probablement automatiquement utilisées pour vérifier votre identité à un niveau inférieur à celui de la "voix" méthode de contrôleur.
De manière plus générale, les cookies sont pas requis pour l'AJAX. XmlHttpRequest soutien (ou même iframe remoting, sur les anciens navigateurs) est tout ce qui est techniquement nécessaire.
Cependant, si vous souhaitez assurer la sécurité de l'AJAX activé la fonctionnalité, puis on applique les mêmes règles qu'avec 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.
XmlHttpRequest ne vais pas en faire des requêtes inter-domaine (pour exactement les raisons de votre doigt sur).
Vous pourriez normalement injecter un script pour envoyer le cookie à votre domaine à l'aide d'une iframe remoting ou JSONP, mais alors HTTP-ne protège que le cookie de nouveau, car il est inaccessible.
À moins que vous avait compromis StackOverflow.com du côté du serveur, vous ne seriez pas en mesure de voler mon cookie.
Envisager ce scénario:
Avec HTTP-Seulement les témoins, la deuxième étape serait impossible, ainsi à l'encontre de mon XSS tentative.
C'est correct. Vous pouvez toujours session détourner de cette façon. Il ne prend de manière significative mince le troupeau de gens qui peuvent exécuter avec succès de même que XSS hack contre vous si.
Cependant, si vous allez revenir à mon exemple de scénario, vous pouvez voir où le HTTP Seule ne réussi à couper les attaques XSS qui reposent sur la modification du client cookies (pas rare).
Elle se résume au fait que a) aucune amélioration permettra de résoudre tous vulnérabilités et b) aucun système ne jamais être complètement sécurisée. HTTP Seule est un outil utile dans la consolidation de contre XSS.
De la même façon, même si la croix de restriction de domaine sur XmlHttpRequest n'est pas 100% de succès dans la prévention de toutes les XSS exploits, tu serais encore jamais rêve de retrait de la restriction.
csrf
jeton dans des cookies. Je suppose que l'appel AJAX qui a besoin d'uncsrf
vérification ne fonctionne pas, sauf si vous placez le jeton csrf caché dans un élément HTML pour la JS pour le récupérer.Pas forcément, cela dépend de ce que vous voulez faire. Pourrais-tu élaborer un peu? AJAX n'a pas besoin d'accéder à des cookies pour fonctionner, il peut faire des requêtes pour extraire des informations, la page demande que l'appel AJAX fait pourrait avoir accès aux données de cookie & pass retour à l'appel de script sans avoir Javascript pour accéder directement à l'cookies
Oui, ils sont une option viable pour un Ajax basé sur site. Les cookies d'authentification ne sont pas à la manipulation par les scripts, mais sont tout simplement inclus par le navigateur sur toutes les requêtes HTTP vers le serveur.
Scripts n'avez pas besoin de vous soucier de ce que le cookie de session, dit - aussi longtemps que vous êtes authentifié, alors toutes les requêtes vers le serveur lancé par un utilisateur ou le script d'inclure les cookies. Le fait que les scripts ne peuvent pas, eux, savent le contenu du cookie n'a pas d'importance.
Pour tous les cookies qui sont utilisés à des fins autres que l'authentification, il peut être défini sans le HTTP seul drapeau, si vous voulez script pour être en mesure de les modifier ou de les lire. Vous pouvez choisir les cookies doivent être uniquement HTTP, par exemple, quelque chose de non-sensibles comme les préférences de l'INTERFACE utilisateur (de l'ordre de tri, l'effondrement volet de gauche ou pas) peuvent être partagés dans les cookies avec les scripts.
J'aime vraiment le seulement les cookies HTTP - c'est un de ces propriétaires extensions de navigateur qui a été une très bonne idée.
Il y a un peu plus de cela.
Ajax n'est pas strictement besoin d'utiliser des cookies, mais ils peuvent être utiles que d'autres affiches ont mentionné. Marquage d'un cookies HTTPOnly de le cacher à partir de scripts en partie seulement, car pas tous les navigateurs prennent en charge, mais aussi parce qu'il existe des solutions de contournement.
C'est bizarre que le XMLHTTPresponse les en-têtes sont de donner le cookie, techniquement, le serveur n'a pas à le cookie de retour avec la réponse. Une fois installé sur le client, il reste en jeu jusqu'à ce qu'il expire. Bien qu'il existe des régimes dans lequel le cookie est changé à chaque requête pour empêcher la ré-utilisation. Donc, vous pourriez être en mesure d'éviter que la solution en changeant le serveur pour ne pas fournir le cookie sur le XMLHTTP réponses.
En général cependant, je pense que HTTPOnly doit être utilisé avec précaution. Il y a cross site scripting des attaques d'où un attaquant organise un utilisateur à envoyer une requête ajax-comme la demande en provenance d'un autre site, à l'aide de simples formulaires de publication, sans l'utilisation de XMLHTTP, et que votre navigateur est toujours active témoin d'authentifier la demande.
Si vous voulez être sûr qu'une requête AJAX est authentifié, la demande elle-même ET les en-têtes HTTP nécessité de contenir le cookie. Par exemple par l'utilisation de scripts ou unique caché entrées. HTTPOnly empêcherait que.
Généralement intéressant de raison de vouloir HTTPOnly est d'empêcher des tiers le contenu sur votre page web à partir de voler des cookies. Mais il y a de nombreuses raisons d'être très prudent sur le contenu de tiers, et le filtre de manière agressive.
Cookies sont automatiquement gérées par le navigateur lorsque vous effectuez un appel AJAX, donc il n'y a pas besoin de Javascript de votre déconner avec les cookies.
Toutes les requêtes HTTP à partir de votre navigateur transmettre vos informations de cookies pour le site en question. JavaScript peut à la fois définir et lire des cookies. Les Cookies ne sont par définition pas requis pour les applications Ajax, mais ils sont nécessaires pour la plupart des applications web pour maintenir l'état de l'utilisateur.
Formelle de réponse à votre question formulée - "N'JavaScript besoin d'accéder à des cookies si l'AJAX est utilisé?" - est donc "non". Pensez amélioré les champs de recherche qui utilisent des requêtes Ajax pour fournir de l'auto-suggérer des options, par exemple. Il n'est pas nécessaire de les informations de cookie dans ce cas.
Que de la clarification - du point de vue du serveur, la page est demandée par une requête AJAX est essentiellement identique à une norme demande HTTP get effectuée par l'utilisateur en cliquant sur un lien. Normal que toutes les propriétés de la demande: user-agent, la propriété intellectuelle, de la session, les cookies, etc. sont transmises au serveur.
Non, la page que l'appel AJAX demandes d'accéder aux cookies trop & c'est ce que vérifie si vous êtes connecté.
Vous pouvez faire d'autres authentification avec le Javascript, mais je n'aurais pas confiance, je préfère toujours mettre une sorte de la vérification de l'authentification dans le back-end.
Oui, les cookies sont très utiles pour l'Ajax.
Mettant l'authentification dans l'URL de la requête est une mauvaise pratique. Il y avait un point de presse la semaine dernière au sujet d'obtenir les jetons d'authentification dans l'URL à partir du cache de google.
Non, il n'existe aucun moyen pour empêcher les attaques. Les anciens navigateurs permettent encore trivial accès aux cookies par l'intermédiaire de javascript. Vous pouvez contourner http, etc. Tout ce que vous venez avec peut être contourné donné assez d'efforts. Le truc, c'est de faire trop d'effort pour être utile.
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 ils ne le font pas, alors vous avez une bonne idée il ya une activité suspecte sur votre compte. La plus courte de la fenêtre de temps le mieux pour la sécurité, mais la charge en plus il met sur votre serveur de génération et la gestion des clés.