43 votes

Cookies de connexion / session, Ajax et sécurité

Je suis en train de déterminer la méthode la plus sûre pour un basé sur ajax formulaire de connexion à l'authentification et de définir un cookie. J'ai vu des choses sur les attaques XSS comme ceci:

http://stackoverflow.com/questions/27972/are-httponly-cookies-a-viable-option-for-an-ajax-website

et

http://www.codinghorror.com/blog/archives/001167.html

Alors, je pense que mes questions de base sont...

1) Est à l'aide de pure ajax pour créer des cookies sûr, si oui, quelle est la méthode la plus sûre (httpOnly + SSL + valeurs chiffrées, etc.)?

2) est-ce un pur ajax méthode implique la création du cookie côté client? Est-ce sécurisé?

3) mettre les cookies de cette façon fiable dans tous les principaux navigateurs/OSs?

4) en utilisant une IFrame masqué être plus en sécurité (de l'appel d'une page web pour définir les cookies)?

5) Si possible, quelqu'un at-il de code (PHP, c'est mon backend)?

Mon but est de mettre les cookies et de les avoir à disposition pour le prochain appel au serveur sans quitter la page.

J'ai vraiment envie de clouer le consensus, le plus sûr moyen de le faire. Finalement, ce code est prévu pour être fait en Open Source, donc s'il vous plaît pas code de commerce (ou rien qui ne résiste pas à l'examen du public)

Merci, -Todd

71voto

thomasrutter Points 42905
  1. Le cookie doit être généré côté serveur, car la session lie le client au serveur, et donc le jeton d'échange doit aller du serveur au client, à un certain stade. Il ne serait pas vraiment utile pour générer le cookie côté client, car le client est non fiable de la machine distante.

    Il est possible d'avoir le cookie ensemble pendant un appel AJAX. Pour le serveur (et le réseau) un appel AJAX est tout simplement un appel HTTP, et toute réponse HTTP par le serveur peut placer un cookie. Donc, oui, il est possible de lancer une session en réponse à un appel AJAX, et le cookie sera stocké par le client à la normale.

    Ainsi, vous pouvez utiliser AJAX pour faire l'enregistrement dans le processus de la même façon que vous pourriez avoir tout misé sur un POST d'un formulaire sur la page. Le serveur va les voir de la même façon, et si le serveur définit un cookie du navigateur de les stocker.

    Fondamentalement, Javascript côté client ne doit jamais être en mesure de connaître la valeur du cookie (et c'est mieux pour la sécurité si elle ne l'est pas, ce qui peut être réalisé à l'aide de la "httponly" cookie extension honoré par les navigateurs récents). Noter que d'autres HTTP appels du client vers le serveur, si elles sont normales demandes de page ou ils sont des requêtes AJAX, comprendra que les cookies automatiquement, même si c'est marqué httponly et le navigateur les honneurs de cette extension. Votre script n'a pas besoin d'être "conscient" de ce cookie.

    Vous avez mentionné à l'aide de SSL qui empêche les autres d'être en mesure de lire les informations en transit, il est donc très pratique pour la prévention de la transmission en clair du mot de passe ou d'autres informations importantes. Il peut aussi aider à protéger contre le réseau des attaques, mais il ne fait pas de vous immunitaire à tout ce qui CSRF peut vous jeter, et il n'est pas du tout de bien vous protéger contre les goûts de fixation de session ou XSS. Je voudrais donc éviter de penser à SSL comme une solution tout si vous l'utilisez.

  2. (voir 1. J'ai combiné)

  3. Étant donné que le cookie est défini par le serveur dans son-têtes de réponse HTTP, oui il est fiable. Cependant, pour le rendre compatible avec tous les navigateurs vous avez encore besoin de s'assurer de l'ouverture de session est possible lors de l'AJAX n'est pas disponible. Cela peut nécessiter la mise en œuvre d'une alternative que l'on voit que quand il n'y a pas de Javascript ou si l'AJAX n'est pas disponible. (Note: aujourd'hui en 2012, il est devenu beaucoup plus réaliste de compter sur de l'AJAX dans les navigateurs).

  4. Cela ne changerait rien à la sécurité. Il n'y aurait pas besoin, sauf que j'ai vu caché iframes utilisé avant de 'simuler' AJAX avant - ie faire un système d'appels au serveur. Fondamentalement, cependant vous le faites n'a pas d'importance, c'est le paramètre de serveur le cookie, et le client s'engage à accepter et renvoyer le cookie s'il le fait en AJAX ou pas.

Pour la plupart, si vous utiliser AJAX ou non n'affecte pas la sécurité de tous beaucoup plus que tout le réel de la sécurité se fait sur le côté serveur, et le serveur un appel AJAX est juste comme un non-appel AJAX: de ne pas être digne de confiance. Par conséquent, vous aurez besoin d'être conscient des problèmes tels que la session de fixation et de connexion CSRF ainsi que des questions touchant l'ensemble de la session comme CSRF et XSS juste comme beaucoup que vous le feriez si vous étiez à l'aide de pas de l'AJAX. Les questions ne changent pas vraiment lors de l'utilisation d'AJAX, sauf, sauf, je suppose, que vous pouvez faire plus d'erreurs avec une technologie si vous êtes moins familier avec elle, ou c'est plus compliqué.

De réponses mis à jour en juillet 2012

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X