web-dev-qa-db-fra.com

Quel est le meilleur moyen d'implémenter "Remember me" pour un site Web?

Je souhaite que mon site Web ait une case à cocher sur laquelle les utilisateurs peuvent cliquer pour ne pas avoir à se connecter à chaque fois qu'ils visitent mon site Web. Je sais que je devrai stocker un cookie sur leur ordinateur pour mettre cela en œuvre, mais que devrait contenir ce cookie?

En outre, y a-t-il des erreurs communes à éviter pour que ce cookie ne présente pas de vulnérabilité en matière de sécurité, ce qui pourrait être évité tout en offrant la fonctionnalité "Remember me"?

492
Eddie Deyo

Meilleure pratique en matière de cookies de connexion persistants améliorés

Vous pouvez utiliser cette stratégie décrite ici en tant que meilleure pratique (2006) ou ne stratégie mise à jour décrite ici (2015):

  1. Lorsque l'utilisateur se connecte avec l'option Mémoriser mes informations, 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 des nombres aléatoires impossibles à deviner à 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 convient parfaitement).
  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 l'identifiant de la série est présent et que le hachage du jeton correspond à la valeur hash pour cet identifiant de série, l'utilisateur est considéré authentifié . Un 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 envoyé à l'utilisateur (c'est correct pour réutiliser l'identifiant de la série ).
    2. Si la série est présente mais que le jeton ne correspond pas, un vol est supposé. L'utilisateur reçoit un avertissement fort et toutes ses sessions mémorisées 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 offre une défense en profondeur. Si quelqu'un parvient à divulguer la table de la base de données, cela ne laisse pas à un attaquant une porte ouverte pour emprunter l'identité de ses utilisateurs.

519
splattne

Je voudrais stocker un identifiant d'utilisateur et un jeton. Lorsque l'utilisateur revient sur le site, comparez ces deux informations avec un élément persistant, tel qu'une entrée de base de données.

En ce qui concerne la sécurité, il suffit de ne rien mettre dedans qui permettrait à 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.

9
dragonmantank

Stocker leur UserId et un RememberMeToken. Quand ils se connectent avec Remember Me Check, générez un nouveau RememberMeToken (qui invalide toutes les autres machines marquées et se souvient de moi).

Quand ils reviennent, cherchez-les à l'aide du jeton Remember me et assurez-vous que l'ID utilisateur correspond.

8
jonnii

En enquêtant sur des sessions persistantes moi-même, j'ai constaté que le risque pour la sécurité ne valait tout simplement pas. Utilisez-le si vous devez absolument, mais vous ne devriez envisager une telle session que faiblement authentifiée et forcer une nouvelle connexion pour tout ce qui pourrait avoir de la valeur pour 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 (de n commentaire de Jens Roland sur la page @splattne à partir de sa réponse):

  1. En l'interceptant sur une ligne non sécurisée (détection de paquets/détournement 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 injection SQL, mais peut être n'importe quoi)
  4. Par un hack XSS (ou exploit similaire du côté client)
3
Jarl