Je confie actuellement un système d'authentification. Ma mise en page actuelle est d'obtenir son email de la $_POST
, MD5 Son mot de passe et vérifiez la base de données contre son email et son mot de passe. Si cela correspond, j'utilise session_start
, et je commence à stocker des données dans le $_SESSION
variable, comme:
$_SESSION['uid'] = $uid;
$_SESSION['first_name'] = $first_name;
Et sur chaque page du site Web, je préformerais une vérification simple de
isset($_SESSION['uid']);
sinon, rediriger vers la page d'index, si c'est, chargez la page.
Est-ce que je fais ça correctement? Est-ce assez sécurisé? Quelle est la facilité pour quelqu'un de forger ces données?
Quelqu'un m'a dit que je devrais créer une table, avec l'email de l'utilisateur et son identifiant de session et utilisez-le pour gérer les choses ... Je suis devenu plutôt confus - comment cela pourrait-elle aider?
Quelqu'un pourrait-il clarifier cela? Quelle est la bonne façon de gérer l'authentification avec PHP sessions?
Merci.
Mise à jour de la sécurité : À compter de 2017-10-23: Les conseils de cette réponse, de la signification historique, sont totalement peu sûrs. On ne devrait jamais utiliser MD5 dans le hachage d'un mot de passe car il est si facilement brut forcé. Voir cette réponse Comment utiliser le mot de passe intégré_ * API à hachage et vérifiez les mots de passe.
J'ai traité plus tôt de systèmes de connexion/d'authentification et je trouve plusieurs lacunes dans cette méthode:
Addenda (19 sept. 2015) * Regardez cette page Link . Il explique toutes les bases, les approches que vous pourriez prendre, pourquoi vous devriez prendre ces approches et vous donne également un échantillon PHP code. S'il est trop long de lire, passez à la fin, attrapez le code et obtenir ensemble!
meilleure approche : Pour stocker MD5 de username+password+email+salt
Dans la base de données, sel Être aléatoire et stocké avec l'enregistrement de l'utilisateur.
meilleure approche : Pour générer une session aléatoire lorsque l'utilisateur se connecte avec succès, et stockez cet identifiant de session dans le $_SESSION[]
déployer. Vous devrez également associer la sessionID avec son UID (à l'aide de la base de données ou memcached). Les avantages sont:
Edit: J'ai toujours utilisé manuellement les cookies pour ma séance de manutention. Cela vous aide à intégrer plus facilement les composants JavaScript de mes applications Web. Vous aurez peut-être besoin de la même chose dans vos applications, à l'avenir.
Il n'y a rien de mal avec de le faire
isset($_SESSION['uid']);
Les données de session ne sont pas transmises à l'utilisateur, elles sont stockées sur le serveur (ou partout où le gestionnaire de session le stocke). Ce qui est transmis à l'utilisateur est l'ID de session qui est juste une chaîne aléatoire générée par PHP, cela peut être volé bien sûr car elle est envoyée à l'utilisateur.
Il convient de noter clairement que stocker de manière aléatoire une chaîne dans la base de données et la session des utilisateurs, puis en l'utilisant pour identifier l'utilisateur ne rend pas la session plus sécurisée, si l'attaquant reçoit la session, ils auront toujours compromis l'utilisateur.
Ce que nous discutons est maintenant session hijacking , vous pouvez penser que vous pouvez simplement enregistrer l'adresse IP dans la session et vérifier que la propriété intellectuelle provenant de la demande et être fait avec elle. Cependant, ce n'est souvent pas si simple, j'ai été brûlé avec cela récemment lorsqu'il s'agissait d'une grande application Web, nous stockions un hachage de l'adresses IP + IP de la session, puis vérifiez qu'elles correspondaient à chaque occasion, pour 99% des utilisateurs. Cela a fonctionné bien. Cependant, nous avons commencé à obtenir des appels de personnes qui ont constaté qu'ils étaient continuellement déconnectés sans explication. Nous avons mis la journalisation sur la session sur les chèques de détournement de la session pour voir ce qui se passait et constaté que ces personnes entreraient sur une propriété intellectuelle et leur session continuerait d'une autre, ce n'était pas une tentative de détournement, mais c'était à voir comment leur serveur proxy a fonctionné, par conséquent, nous avons modifié notre code de détournement de la session pour déterminer la classe de l'adresse IP et à partir de là, déterminez la partie réseau de l'adresse IP et stockez simplement ces parties de l'adresse IP, ceci est Un peu moins sécurisé dans ce détournement de la session pourrait théoriquement venir de l'intérieur du même réseau, mais que tous nos faux positifs disparaissent.
Je dois ajouter à cela. Si vous faites le "MD5, le mot de passe, vérifiez la méthode de la base de données", cela vous suggère que le mot de passe est stocké dans un seul hachage MD5. Ce n'est plus une façon standard de stocker des mots de passe hachés.
J'ai trouvé ce lien très instructif: http://www.itnewb.com/tatudial/encrypturing-passwords-with-php-for-storage-utilisateur-the-rsa-pbkdf2tandard