web-dev-qa-db-fra.com

Manière correcte de gérer des sessions dans PHP?

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.

38
daniel

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:

  • vous "MD5 Son mot de passe et vérifiez la base de données" - cela signifie que si une personne a accès à la base de données, il peut distinguer qui a les mêmes mots de passe!

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.

  • l'utilisation du "UID" directement dans les variables de session peut être très risquée. Considérez ceci: mon ami est connecté depuis mon navigateur et il part pour une fuite. Je vérifie rapidement quels cookies sont installés dans son navigateur et déchiffrer son "UID". Maintenant je le possède!

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:

  1. Vous pouvez même lier une sessionID à une adresse IP particulière afin que la sessionID ne puisse pas être abusée même si elle est capturée
  2. Vous pouvez invalider une session plus ancienne si l'utilisateur se connecte à un autre emplacement. Donc, si mon ami se connecte de son propre ordinateur, la sessionID sur mon ordinateur devient automatiquement invalide.

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.

43
jrharshath

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.

26
linead

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

4
BlackBeltScripting