2012-06-27 6 views
1

Lorsqu'un utilisateur sélectionne la fonction remember me, j'enregistre son nom d'utilisateur et son identifiant dans un cookie. Ensuite, lorsque l'utilisateur revient sur le site, je vérifie le nom d'utilisateur et l'identifiant par rapport à une base de données pour m'assurer que l'utilisateur est légitime. Je note ensuite l'utilisateur en stockant les données de cookie dans la variable de session. Est-ce la bonne façon de se souvenir et de se connecter à un utilisateur?Enregistrement des informations utilisateur dans un cookie

+0

http://stackoverflow.com/questions/2594960/best-practice-to-implement-secure-remember-me –

Répondre

3

Les cookies ne sont pas un moyen très sûr de stocker des données. Les cookies peuvent être modifiés par un utilisateur et pourraient conduire à un "piratage" de votre site. Ce que je suggère est de stocker une chaîne dans le cookie qui est un hachage de quelque chose. Stockez également la chaîne hachée du cookie dans votre base de données. De cette façon, lorsqu'un utilisateur revient sur le site, vous vérifiez si le cookie est rempli, faites-le correspondre à la valeur hachée dans la base de données et trouvez ensuite qui possède cette valeur hachée. Si tout est valide, les connecter.

configuration de base de données

secretKey PK varchar 
userid (could be unique) int 
validUntil int or date/time 
    //If userID is unique you will have to remove this row from the 
    // database when a new key is made for the user, This would then mean 
    // that a user would only be allowed to be rememberd on one computer 

pseudocode

//User logs in with remember me 
    //set cookie to something like md5(userid,username,timestamp) 
    //store the md5 in the database layout 
//User Returns to site 
    //check to see if cookie is set 
     //if cookie set 
      //find md5 in database which is logged with user id 
      //if found and not yet expired log in 
      //else show login page 
     //if cookie not set show login page 

Dans le valide jusqu'au champ définiriez-à-dire 2 semaines de connexion. Une fois que le valide est passé, ne laissez pas cette clé fonctionner et assurez-vous que le cookie a expiré pour l'utilisateur.

requête pour vérifier se connecter

SELECT * FROM rememberMe OU key = "// mettre md5 ici" ET validUntil> temps()

+0

D'accord, je vois ce que vous dites, mais comment puis-je gérer le champ validUntil? Qu'est-ce que je fais quand cette date passe? – user532493

+0

Voir le nouveau message maintenant – bretterer

+0

Ce champ secretKey devrait-il être dans la table avec tous mes utilisateurs, ou devrait-il y avoir une nouvelle table pour secretKeys? – user532493

2

n °

Cela dépend à quel point sécurisé vous voulez obtenir. Voici quelques choses que vous pouvez faire (tout ou partie d'entre eux) afin d'augmenter la sécurité:

  • Ne pas stocker quoi que ce soit spécifique dans le cookie (nom d'utilisateur/id/etc.). Utilisez un non-sens généré de manière aléatoire (jeton).
    1. Dans votre DB, vous pouvez avoir un jeton < - mapping> utilisateur
    2. Vérifiez le jeton contre votre DB et connectez l'utilisateur quand il y a un match
    3. détruire le jeton (drapeau comme « consommé », peut-être pour être supprimé plus tard, peu importe ce que vous décidez, le jeton ne devrait plus fonctionner).
  • Utilisez https uniquement pour transmettre les biscuits, connexion, etc.
  • Si un utilisateur envoie un jeton périmé (ie qui ne sont pas dans votre base de données, ou qui a été marqué comme consommé), cela signifie qu'il est possible que le jeton ait été compromis. À chaque demande d'utilisateurs authentifiés (et peut-être même avec ajax), comparez le jeton avec lequel ils se sont connectés (vous pouvez le stocker dans la session) avec une liste de tentatives de jetons périmés. S'il y a correspondance, cela signifie qu'il est probable que l'utilisateur authentifié ait piraté le jeton. Mets-les dehors.
+1

D'accord, merci beaucoup pour tous les conseils. – user532493

Questions connexes