web-dev-qa-db-fra.com

Pourquoi Tornado n'a pas de session

J'ai entendu dire que les cookies sont moins sécurisés que la session.
Par exemple, si un site Web utilise un cookie pour détecter si un utilisateur s'est connecté ou non, les gens peuvent forger un cookie pour simuler un faux utilisateur, car il peut lire le cookie et en forger facilement un. Voici un lien que j'ai trouvé: Authentification Session vs Cookie

Maintenant, j'utilise Tornado avec python pour construire un site Web. Voici un exemple simple du module de connexion avec Tornado: https://stackoverflow.com/questions/6514783/tornado-login-examples-tutorials
À ma grande surprise, il n'y a pas de session à Tornado. Son doc dit qu'il y a des cookies sécurisés mais je ne pense pas que ce soit plus sûr que les cookies ordinaires.

cookie ordinaire:

browser ------- I'm Tom, my password is 123 -------> server

cookie sécurisé:

browser ------ &^*Y()UIH|>Guho976879 --------> server

Je pense que si je pouvais obtenir &^*Y()UIH|>Guho976879, je peux toujours forger le cookie, non?

Si j'ai raison, pourquoi Tornado n'a pas la session? Ou existe-t-il un moyen de rendre le cookie sécurisé aussi sécurisé que la session? Peut-être que j'efface les cookies lorsque le navigateur est fermé peut être plus sûr?

12
Yves

J'ai entendu dire que les cookies sont moins sécurisés que la session.

Vous devez avoir mal interprété quelque chose. En fait, les sessions HTTP sont généralement implémentées à l'aide de cookies.

Je pense que si je pouvais obtenir & ^ * Y () UIH |> Guho976879, je peux toujours forger le cookie, non?

Bien sûr, vous pouvez modifier le cookie, mais sera-t-il accepté par le serveur comme valide? Si vous prenez un vrai regardez la documentation vous verrez:

Les cookies ne sont pas sécurisés et peuvent facilement être modifiés par les clients. Si vous devez définir des cookies pour, par exemple, identifier l'utilisateur actuellement connecté, , vous devez signer vos cookies pour empêcher la contrefaçon . Tornado prend en charge les cookies signés avec les méthodes set_secure_cookie et get_secure_cookie. ...
Les cookies signés contiennent la valeur codée du cookie en plus d'un horodatage et d'une signature HMAC. Si le cookie est ancien ou si la signature ne correspond pas, get_secure_cookie renverra None comme si le cookie n'était pas défini .

Ainsi, si vous essayez de manipuler le cookie sécurisé, le framework remarquera et traitera le cookie comme invalide, c'est-à-dire comme si le cookie n'a jamais été envoyé en premier lieu.

29
Steffen Ullrich

Je pense que les autres réponses ne parviennent pas à répondre à l'attaque principale qui est protégée contre ici, qui n'est pas falsification le cookie, mais falsification avec lui, ou inspection il.

Si vous envoyez un cookie à un navigateur disant "current_user = tom", l'utilisateur peut vous renvoyer un cookie alternatif disant "current_user = dave". Si vous n'avez rien pour valider le cookie, votre application supposera qu'ils sont connectés en tant que "dave".

Cela pourrait être atténué par signature le cookie à l'aide d'une clé secrète - le cookie falsifié n'aurait pas la signature correcte, il serait donc rejeté.

Cependant, il peut toujours y avoir un problème: si une partie de l'état que vous souhaitez stocker est secret. Par exemple, vous pouvez vouloir stocker le prix de revient et la majoration des produits dans le panier de l'utilisateur; clairement un cookie en clair que l'utilisateur peut lire n'est pas approprié ici.

Cela vous laisse deux solutions:

  • Crypter le contenu du cookie, afin qu'il ne puisse être ni lu ni modifié sans connaître la clé privée.
  • Stockez les données réelles localement (par exemple dans un magasin de disque ou de mémoire) et envoyez uniquement un identifiant dans le cookie. Ceci est généralement connu sous le nom de "données de session".

Les sessions sont relativement faciles à mettre en œuvre et sont prouvablement sûres contre ces attaques particulières. Cependant, ils pèsent sur votre infrastructure dorsale, car vos serveurs Web/d'applications doivent pouvoir écrire et lire les données; cela peut être difficile dans des configurations d'équilibrage de charge complexes, par exemple. En tant que tel, le cryptage d'une petite quantité de données directement dans le cookie peut être une alternative judicieuse, car maintenant la seule donnée qui doit être partagée entre vos serveurs d'applications est la clé privée.

Notez qu'aucun de ceux-ci ne protège directement contre d'autres attaques, telles que le piratage, où un utilisateur malveillant clone simplement les cookies d'une véritable session. Les jetons de session peuvent également être vulnérables à une attaque connexe appelée "fixation de session", où un attaquant choisit l'identifiant avant qu'un véritable utilisateur se connecte, et peut ainsi créer des cookies identiques pour lui; cela ne serait pas possible avec un cookie crypté, mais je suis sûr qu'il existe à son tour d'autres attaques uniques.

8
IMSoP

La question que vous avez trouvée ne décrit pas vraiment de quoi (je pense) vous parlez. La différence qu'ils décrivent est de savoir si les informations de session de l'utilisateur (donc des éléments comme quel article se trouve dans leurs achats par exemple) côté serveur et ne transmettent qu'un identifiant unique (aka cookie de session) au client, ou s'il faut stocker le tout sur le client.

Toutes les applications Web doivent avoir un mécanisme de maintien de l'état. HTTP est sans état par défaut, il n'y a donc aucun moyen pour un serveur de faire correspondre une requête à une autre.

La plupart des applications résolvent ce problème en utilisant des cookies. Les défis de sécurité liés à l'utilisation des cookies sont bien compris et, s'ils sont correctement mis en œuvre, ils ne devraient pas entraîner de problèmes de sécurité importants.

Les autres options pour ce faire sont généralement des en-têtes d'autorisation, donc en utilisant soit le résumé HTTP ou l'authentification NTLM. ce qui est plus courant dans les applications d'entreprise internes, ou pour générer ces en-têtes à l'aide de JavaScript (que vous voyez avec certaines applications modernes de page unique).

Quoi qu'il en soit, certaines informations doivent être transmises du client au serveur à chaque demande d'identification de l'utilisateur.

En ce qui concerne la falsification de cookies, généralement un jeton de session aura un degré d'aléatoire élevé, il n'est donc pas pratique de forger une valeur de cookie.

1
Rory McCune