38 votes

Comment gérer correctement les sessions en PHP ?

Je suis en train de mettre en place un système d'authentification. Ma configuration actuelle consiste à obtenir son adresse électronique à partir de la base de données de l'entreprise. $_POST md5 son mot de passe, et je vérifie la base de données avec son email et son mot de passe. Si cela correspond, j'utilise session_start et je commence à stocker des données dans le fichier $_SESSION variable, comme ceci :

 $_SESSION['uid'] = $uid;
 $_SESSION['first_name'] = $first_name;

Et sur chaque page du site, j'effectuerais une simple vérification des éléments suivants

isset($_SESSION['uid']);

si non, rediriger vers la page d'index, si oui, charger la page.

Est-ce que je fais cela correctement ? Est-ce que c'est suffisamment sécurisé ? Est-il facile pour quelqu'un de falsifier ces données ?

Quelqu'un m'a dit que je devrais créer un tableau avec l'adresse électronique de l'utilisateur et son identifiant de session et l'utiliser pour gérer les choses... Je suis assez confus - en quoi cela peut-il m'aider ?

Quelqu'un pourrait-il clarifier ce point ? Quelle est la bonne façon de gérer l'authentification avec les sessions PHP ?

Gracias.

1 votes

Vous savez déjà comment utiliser correctement les sessions. Cependant, ce que vous essayez de construire, c'est un module authentification système. C'est beaucoup plus complexe. Vous pouvez jeter un coup d'œil à github.com/delight-im/PHP-Auth et inspecter sa source pour voir quelque chose dans lequel beaucoup d'efforts et de réflexion ont été mis.

43voto

jrharshath Points 10422

Mise à jour de sécurité : en date du 2017-10-23 : Les conseils de cette réponse, bien qu'ayant une importance historique, ne sont absolument pas sûrs. Il ne faut jamais utiliser md5 pour hacher un mot de passe car il est si facilement forcé par brute. Voir cette réponse sur la façon d'utiliser l'API intégrée password_* pour hacher et vérifier les mots de passe.


J'ai déjà eu affaire à des systèmes de connexion/authentification et je trouve que cette méthode présente plusieurs lacunes :

  • 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, elle peut savoir qui a les mêmes mots de passe !

ADDENDUM (19 Sep 2015) * Regardez ça. enlace . Il explique toutes les bases, les approches que vous pouvez adopter, pourquoi vous devriez adopter ces approches et vous donne également des exemples de code PHP. Si c'est trop long à lire, il suffit d'aller à la fin, de prendre le code et de se lancer !

MEILLEURE APPROCHE : pour stocker le md5 de username+password+email+salt dans la base de données, sel étant aléatoire, et stocké avec le dossier de l'utilisateur.

  • l'utilisation de l'"uid" directement dans les variables de session peut être très risquée. Prenons l'exemple suivant : mon ami est connecté à partir de mon navigateur, et il part pour une fuite. Je vérifie rapidement quels cookies sont définis dans son navigateur et je déchiffre son 'uid'. Maintenant, il m'appartient !

MEILLEURE APPROCHE pour générer un identifiant de session aléatoire lorsque l'utilisateur se connecte avec succès, et stocker cet identifiant de session dans le fichier $_SESSION[] réseau. Vous devrez également associer le sessionid à son uid (en utilisant la base de données, ou memcached). Les avantages sont :

  1. Vous pouvez même lier un identifiant de session à une IP particulière afin que l'identifiant de session ne puisse pas être utilisé de manière abusive même s'il est capturé.
  2. Vous pouvez invalider un ancien identifiant de session si l'utilisateur se connecte depuis un autre endroit. Ainsi, si mon ami se connecte depuis son propre ordinateur, l'identifiant de session de mon ordinateur devient automatiquement invalide.

EDIT : J'ai toujours utilisé les cookies manuellement pour la gestion de mes sessions. Cela m'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.

0 votes

Comment puis-je générer un identifiant de session aléatoire ? avec start_session ?

1 votes

Avec une application intelligente de la fonction aléatoire. Je l'ai essayé, et il donne d'assez bons résultats regardez ici : jrharshath.qupis.com/random

0 votes

@AwalGarg Vous avez raison. J'ai ajouté un addendum pour le faire d'une manière plus crypto-sécurisée.

26voto

linead Points 1295

Il n'y a rien de mal à faire ça

isset($_SESSION['uid']);

Les données de session ne sont pas transmises à l'utilisateur, elles sont stockées sur le serveur (ou à l'endroit où le gestionnaire de session les stocke). Ce qui est transmis à l'utilisateur est l'identifiant de session qui est juste une chaîne aléatoire générée par PHP, il peut être volé bien sûr parce qu'il est envoyé à l'utilisateur.

Il convient de noter que le stockage aléatoire d'une chaîne de caractères dans la base de données et dans la session de l'utilisateur, puis l'utilisation de cette chaîne pour identifier l'utilisateur, ne rend pas la session plus sûre. Si l'attaquant obtient la session, il aura quand même compromis l'utilisateur.

Ce dont nous discutons maintenant est détournement de session Vous pensez peut-être qu'il suffit de stocker l'adresse IP dans la session, de la vérifier avec l'IP provenant de la requête et d'en finir. Cependant, ce n'est souvent pas aussi simple. J'ai été confronté à ce problème récemment lorsque, sur une grande application web, nous stockions un hachage de l'agent utilisateur et de l'adresse IP dans la session et vérifiions ensuite qu'ils correspondent à chaque fois, ce qui fonctionnait bien pour 99 % des utilisateurs. Cependant, nous avons commencé à recevoir des appels de personnes qui trouvaient qu'elles étaient continuellement déconnectées sans explication. Nous avons mis en place des contrôles de détournement de session pour voir ce qui se passait et nous avons découvert que ces personnes arrivaient sur une IP et que leur session se poursuivait sur une autre, ce qui n'était pas une tentative de détournement mais était lié au fonctionnement de leur serveur proxy. classe de l'adresse IP et à partir de là, déterminer la partie réseau de l'adresse IP et ne stocker que ces parties de l'adresse IP, ce qui est légèrement moins sûr dans la mesure où le détournement de session pourrait théoriquement provenir de l'intérieur du même réseau, mais cela a fait disparaître tous nos faux positifs.

4voto

Je dois ajouter quelque chose. Si vous utilisez la méthode "MD5 le mot de passe, puis vérifier la base de données", cela suggère que le mot de passe est stocké dans un seul hachage md5. Ce n'est plus une façon standard de stocker les mots de passe hachés.

J'ai trouvé ce lien très instructif : http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

-3voto

Rigobert Song Points 1806

Je ne suis pas sûr à 100% mais je pense qu'il est possible de falsifier la session si quelqu'un le voulait vraiment !

Je pense que la sauvegarde de l'identifiant de session dans une table est le moyen le plus sûr de le faire.

Je me suis un peu penché sur la question récemment, mais là encore, je ne suis pas sûr, je suis curieux de savoir quelles sont les meilleures pratiques !

Voici quelques ressources à consulter

http://www.sitepoint.com/article/php-security-blunders/

http://www.phpeasystep.com/workshopview.php?id=6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X