Question Quelle est la meilleure façon de mettre en œuvre "remember me" pour un site Web? [fermé]


Je souhaite que mon site Web contienne une case à cocher sur laquelle les utilisateurs peuvent cliquer pour ne pas devoir se connecter chaque fois qu'ils visitent mon site Web. Je sais que je devrai stocker un cookie sur leur ordinateur pour l'implémenter, mais que devrait contenir ce cookie?

De plus, y a-t-il des erreurs courantes à surveiller pour éviter que ce cookie ne présente une faille de sécurité, ce qui pourrait être évité tout en donnant la fonctionnalité 'remember me'?


461


origine


Réponses:


Meilleure pratique des cookies de connexion persistante améliorée

Vous pourriez utiliser cette stratégie décrite ici comme meilleure pratique (2006) ou une stratégie mise à jour décrite ici (2015):

  1. Lorsque l'utilisateur se connecte avec succès avec Se souvenir de moi, un cookie de connexion est émis en plus du cookie de gestion de session standard.
  2. Le cookie de connexion contient un identifiant de série et un jeton. La série et le jeton sont nombres aléatoires non quantifiables à partir d'un espace suffisamment grand. Les deux sont stockés ensemble dans une table de base de données, le jeton est haché (sha256 c'est bien).
  3. Lorsqu'un utilisateur non connecté visite le site et présente un cookie de connexion, l'identifiant de la série est recherché dans la base de données.
    1. Si la identifiant de série est présent et le hash de la jeton correspond au hachage de l'identifiant de la série, l'utilisateur est considéré authentifié. UNE nouveau jeton est généré, un nouveau hachage pour le jeton est stocké sur l'ancien enregistrement et un nouveau cookie de connexion est émis pour l'utilisateur (il est possible de réutiliser le jeton identifiant de série).
    2. Si la série est présente mais que le jeton ne correspond pas, un vol est assumé. L'utilisateur reçoit un avertissement fortement formulé et toutes les sessions mémorisées par l'utilisateur sont supprimées.
    3. Si le nom d'utilisateur et la série ne sont pas présents, le cookie de connexion est ignoré.

Cette approche fournit une défense en profondeur. Si quelqu'un réussit à faire fuir la table de base de données, cela ne donne pas à un attaquant une porte ouverte pour usurper l'identité des utilisateurs.


483



Je voudrais stocker un ID utilisateur et un jeton. Lorsque l'utilisateur revient sur le site, comparez ces deux informations par rapport à quelque chose de persistant comme une entrée de base de données.

Pour ce qui est de la sécurité, ne mettez rien qui permette à quelqu'un de modifier le cookie pour obtenir des avantages supplémentaires. Par exemple, ne stockez pas leurs groupes d'utilisateurs ou leur mot de passe. Tout ce qui peut être modifié pour contourner votre sécurité ne doit pas être stocké dans le cookie.


8



Stockez leur UserId et un RememberMeToken. Quand ils se connectent avec Se souvenir de moi, cochez la case Générer un nouveau RememberMeToken (qui invalide toutes les autres machines marquées, souvenez-vous de moi).

Quand ils reviennent les chercher par le jeton «Souviens-toi de moi» et vérifie que le UserId correspond.


7



En enquêtant moi-même sur les sessions persistantes, j'ai constaté que cela ne valait tout simplement pas le risque de sécurité. Utilisez-le si vous devez absolument, mais vous devriez considérer qu'une telle session n'est que faiblement authentifiée et forcer une nouvelle connexion pour tout ce qui pourrait être utile à un attaquant.

La raison en est bien sûr que vos cookies contenant votre session persistante sont si facilement volés.

4 façons de voler vos cookies (à partir de un commentaire de Jens Roland sur la page @splattne basé sa réponse sur):

  1. En l'interceptant sur une ligne non sécurisée (reniflage de paquets / piratage de session)
  2. En accédant directement au navigateur de l'utilisateur (via un logiciel malveillant ou un accès physique à la boîte)
  3. En le lisant à partir de la base de données du serveur (probablement SQL Injection, mais pourrait être n'importe quoi)
  4. Par un hack XSS (ou un exploit similaire client)

5