2010-08-09 3 views
2

On m'a dit qu'il n'était pas sûr de stocker des éléments tels que des mots de passe, des noms d'utilisateur et des ID utilisateur dans les cookies et que vous deviez stocker un ID de session dans un cookie. Voici où je me perds.Accès aux données de session avec un ID de session

Mon objectif est d'avoir une fonction de base «se souvenir de moi». Normalement, je stocke les informations de connexion des utilisateurs dans un cookie, mais comme c'est dangereux, je me demande quelle est l'alternative. Je comprends que chaque fois que je crée une session, il crée un cookie qui crée un identifiant unique, mais expire lorsque je ferme mon navigateur. Alors, comment puis-je avoir accès aux informations de cette session après la fermeture du navigateur?

Toute aide est appréciée.

Répondre

2

Peut-être la meilleure approche, comme cela a été suggéré et ce que la plupart des applications tierces font, est de créer une table de base de données « user_sessions » avec les champs suivants:

session_id (var_char) 
user_id (int) 
ip_address (var_char) 
last_logged_in (unix timestamp) 

Ensuite, utilisez un cookie pour stocker une md5 de tout ce que vous aimez, peut-être:

md5($username.$ip); //since md5 has a lot of reverse look ups now you should use a number of fields to validate. You could use a different crypto function to make it more difficult to crack, but md5 is the simplest version available in all php versions. 

EDIT: vous comparera ensuite le hachage stocké à partir du cookie avec la base de données sESSION_ID pour voir si elles ont déjà ouvert une session la raison de combiner un coupl. e des champs dans la fonction md5 est de créer un format de hachage moins "devinable". Cela rend moins probable que quelqu'un puisse éditer un cookie et se connecter comme quelqu'un d'autre.

Cela pourrait être fait pour tous les utilisateurs (de cette façon, vous pouvez suivre qui est en ligne) et simplement définir une variable de connexion "persistant" dans le cookie. par exemple.

p_login=true || p_login=false 

De cette façon, vous saurez si vous devez vous connecter automatiquement ou forcer la connexion.

note: Vous pouvez consulter le http://www.openwall.com/articles/PHP-Users-Passwords pour trouver des mots de passe, des sessions et des utilisateurs différents.

+0

Merci pour ça! Questions de couple: Le paramètre sessionID est-il identique à celui stocké dans le cookie ('md5 ($ nomutilisateur.ip);')? // Selon votre exemple, l'adresse IP semble être utilisée pour l'authentification, donc si leur adresse IP change (proxy), ils devraient se connecter à nouveau, correct? (pas un problème, juste curieux.) // Aussi, quel est exactement le but du champ last_logged_in? (encore une fois, juste curieux?) – williamg

+0

L'adresse IP est juste quelque chose d'unique à hacher. Il est plus probable qu'un utilisateur réalise que vous ne faites que masquer un nom d'utilisateur. Ensuite, ils pourraient pirater un cookie et se connecter comme n'importe qui. Si c'est md5 ($ username. $ Ip), il est plus difficile de déterminer ce que sera le hash. Peu importe si l'adresse IP change car elle est stockée dans le cookie sous la forme d'un hachage md5. Il suffit donc de vérifier si une session existe dans la base de données avec session_id = 'md5 ($ username. $ Id)'. si ce n'est pas le créer. si elle se met à jour avec la nouvelle adresse IP et le hachage. Le dernier enregistrement de l'heure et de l'adresse IP est juste pour des raisons de sécurité. Si un accès non autorisé vous pouvez vérifier. – User123342234

+0

mettre à jour ma réponse pour clarifier un peu plus. – User123342234

2

Cela pourrait être une courbe d'apprentissage assez raide. Avez-vous envisagé d'utiliser un CMS ou une autre solution préexistante pour ce que vous voulez réaliser, ou même un cadre qui pourrait inclure cette fonctionnalité? Pour une fonction «Mémorisez-moi», vous pouvez envoyer des cookies contenant l'ID utilisateur et un hachage du mot de passe hashé de cet utilisateur avec un jeton connu, mais secret. Cependant, cette solution ne vous permet pas d'expirer à distance quelqu'un, sans réinitialiser le mot de passe de quelqu'un.

Une autre approche consiste donc à générer un jeton unique pour la connexion de cette personne et à avoir une autre table de base de données reliant ce jeton unique à un utilisateur particulier et une date d'expiration.

+0

définitivement la dernière approche ... –

+0

Mais l'utilisation d'un jeton ne serait-elle pas aussi vulnérable que le stockage d'un mot de passe ou d'un ID utilisateur? – williamg

+0

Et en ce qui concerne la première partie de votre réponse, j'ai envisagé d'utiliser des modèles, mais il y a des raisons pour lesquelles je ne le fais pas. Principalement, j'aime le faire moi-même et j'aime apprendre comment le faire. Dans mon esprit, je n'apprendrai pas comment le faire à moins que je ne le fasse moi-même. (Et en faisant moi-même je veux dire apprendre à le faire sur le web, ou par les gens bien ici à SO) – williamg

Questions connexes