web-dev-qa-db-fra.com

Toute raison de NE PAS définir tous les cookies pour utiliser httponly et sécurisé

En supposant qu'un site utilise tout le HTTPS tout le temps (LB redirige le port 80 vers 443), y a-t-il une raison pour ne pas forcer chaque cookie défini par l'application à utiliser les deux secure ET httponly?

Actuellement, par exemple, une analyse PCI ne signalera que jsessionid comme n'utilisant pas l'attribut secure, mais demain ce pourrait être l'autre, donc j'essaie de prendre de l'avance.

35
user2145893

Oui, il y a des cas où vous ne voulez pas HTTP UNIQUEMENT ou SÉCURISÉ.

Pour HTTP uniquement, vous souhaiterez peut-être que javascript interagisse avec le cookie. Peut-être que vous suivez l'état de la page dans un cookie, écrivez dans le cookie avec JS et lisez à partir de JS. De plus, je vois souvent CSRF implémenté avec un cookie non uniquement http.

Pour le cookie sécurisé, je ne m'attendrais pas à ce que les cookies n'aient jamais l'attribut sécurisé, à l'exception de ces deux cas:

  1. les environnements de développement n'ont souvent pas ou n'ont pas besoin de certificats TLS (bien qu'ils le fassent peut-être)
  2. pour suivre l'activité qui a commencé sur http. Vous pouvez même utiliser votre équilibreur de charge pour définir un cookie non sécurisé avant de renvoyer la redirection. Ensuite, l'analyse de votre application peut suivre les URL entrées en HTTP.

En pratique, si vous exécutez un site https, définissez toujours le cookie sécurisé , et si vous ne connaissez pas les exigences JS, toujours erreur sur le côté avec HTTPONLY défini .

MISE À JOUR DES ADRESSE DES COMMENTAIRES

Beaucoup de discussions pour savoir si vous devez ou non utiliser TLS en production. Posé la question ici:

Dois-je développer ou désactiver TLS?

38
Jonathan

Concernant httponly, vous demandez essentiellement s'il s'agit de cas d'utilisation où un cookie doit être lu ou défini par Javascript. En règle générale, certains paramètres de l'interface utilisateur (choix de la langue ...) sont conservés de cette manière, ce qui se briserait si le cookie est httponly.

Quant à secure: puisque selon votre description le site utilise tout le temps https cela ne nuit pas à avoir tous les cookies secure.

20
Steffen Ullrich

Drapeau sécurisé

Étant donné que l'application s'exécute sur HTTPS, c'est-à-dire que LB redirige tout le trafic du port 80 vers 443, il est toujours nécessaire d'activer l'indicateur sécurisé à la lumière du scénario suivant.

  1. Supposons qu'il y ait un problème de développement à la suite duquel un lien hypertexte contient le lien HTTP (par exemple http://example.com/some_page.php ) au lieu du HTTPS (par exemple https://example.com/some_page.php ) lien.
  2. Le navigateur demande la ressource Web via HTTP et envoie le cookie avec lui en raison de l'absence de l'indicateur sécurisé.
  3. La demande atteint le LB qui redirige le trafic vers le port 443, c'est-à-dire via HTTPS.
  4. Le navigateur relance la demande mais cette fois via HTTPS avec la valeur du cookie.

Par conséquent, bien que le LB soit configuré pour rediriger le trafic non sécurisé du port 80 vers le trafic sécurisé du port 443, une attaque MiTM réussie pourrait avoir lieu à step 2 entraînant l'emprunt d'identité d'un utilisateur en volant les cookies sensibles. De plus, vérifier que les hyperliens et les redirections sont correctement codés est une activité comparativement plus ardue que d'activer l'indicateur sécurisé sur les cookies sensibles. Pour conclure, bien qu'une redirection soit établie au niveau LB, il pourrait y avoir des scénarios possibles où un MiTM fructueux pourrait être exécuté en raison de l'absence du drapeau sécurisé.

Drapeau httponly

Il s'agit d'un indicateur dont la signification reste indépendante de la sécurité de la couche de transport (SSL/TLS). Le drapeau httponly est utilisé pour empêcher javascript d'accéder aux cookies sensibles comme les cookies de session en cas de réussite d'une attaque Cross-Site Scripting (XSS). Lorsque l'indicateur httponly n'est pas défini sur la valeur du cookie, le javascript malveillant injecté dans l'application en raison d'une faille au niveau de l'application pourrait finir par saboter la confidentialité, l'intégrité et la disponibilité des comptes d'utilisateurs en lisant les cookies de session et en les envoyant à des serveurs distants par exemple , usurpant ainsi avec succès l'identité d'un utilisateur légitime. Par conséquent, le drapeau httponly doit toujours être défini sur tous les cookies ou au moins les cookies sensibles.

9
Tony Thomas

Je vais vous donner un exemple pratique d'un cookie non httponly.

Lorsqu'un visiteur vient sur mon site, deux cookies lui sont enfoncés dans la gorge.

phpsession -> secure httponly samesite:lax
cookie_law -> secure samesite:lax

Le cookie_law contient un objet cookie codé json encodé en base64 qui stocke les paramètres des cookies.

Mon javascript lit ces cookies pour déterminer de charger des analyses, des adwords dépendant de l'autorisation ou de l'état.
Mon javascript utilise également ce cookie pour faire fonctionner l'éditeur de paramètres de cookie.

Si je mets le drapeau httponly sur les cookies, le javascript ne peut pas le lire. Et je ne peux pas utiliser php pour déterminer l'état de charge lors du rendu des scripts en raison de plusieurs couches de mise en cache. C'est pourquoi j'ai choisi de quitter le httponly de ce cookie.

Le javascript doit avoir accès pour pouvoir le lire.

5
Tschallacka

http-only: Parfois, les préférences des utilisateurs (taille de police, thème, langue, ...) sont définies et agies côté client. Il s'agit du cas le plus courant pour lequel il n'est pas nécessaire de définir uniquement http.

secure: Comme le site/l'application insiste sur HTTPS, il n'y a aucune raison de ne pas utiliser l'indicateur sécurisé. Si le site/l'application doit offrir un accès via HTTP et que vous avez besoin de détails pour passer d'un contexte crypté à aucun autre (peut-être à nouveau les préférences d'affichage de l'utilisateur), vous devez laisser cette option désactivée.

Bien que cela puisse sembler sans importance car vous forcez actuellement l'accès HTTPS, vous devez autoriser les échecs dans la mesure où: votre application peut être redéployée avec des paramètres incorrects, ou vos utilisateurs peuvent se retrouver soumis à un MItM (quelque chose de malveillant ou un proxy mal configuré) ) qui a un effet similaire et avec ce paramètre défini, les choses échouent (du point de vue de la sécurité) en arrêtant de fonctionner plutôt qu'en travaillant de manière non sécurisée.

Général: Comme il s'agit de mesures de sécurité, aussi minimes qu'elles puissent paraître, définissez toujours les deux, sauf si vous avez une raison spécifique de ne pas le faire, plutôt que de ne jamais les laisser par défaut, sauf si vous pensez qu'elles sont nécessaires.

3
David Spillett