2009-04-15 8 views
2

Je travaille sur un site web et je veux créer une connexion et une session utilisateur. Quel est le moyen le plus sûr de vérifier si une session existe ou non (comme un contrôle de cookie ou de variable de session), ou une meilleure idée d'utiliser des sessions en php?façon la plus sûre de créer des sessions en php

Répondre

8

session_id() retourne t l'identifiant de session pour la session en cours ou la chaîne vide ("") s'il n'y a pas de session en cours (aucun identifiant de session actuel n'existe).

http://de.php.net/manual/en/function.session-id.php

mais vous indique juste si une session est active ou non.

la plupart du temps, j'appelle simplement session_start(); au début de chaque script (même si l'utilisateur n'est pas connecté). lors de la connexion, j'ai défini $_SESSION['user'] avec l'ID utilisateur ou un objet utilisateur. à la déconnexion, je viens de unset($_SESSION['user']);. en vérifiant empty($_SESSION['user']) je peux vérifier si quelqu'un est encore connecté ou non. ne le faites pas si vous stockez des informations dépendant de l'utilisateur ailleurs dans votre session, sinon le prochain type qui se connecte peut obtenir des informations qu'il n'est pas supposé voir (dans ce cas, utilisez session_destroy();).

mais la sécurité? Il suffit de désactiver la propagation de l'identifiant de session par les réécritures d'url GET/POST (cookies uniquement), afin qu'elles ne se retrouvent pas dans les URL pouvant être mises en cache ou distribuées aux autres (dans ce cas, le piratage de session serait possible). vous pouvez le faire en définissant session.use_only_cookies dans le fichier php.ini. Il peut y avoir des problèmes de sécurité supplémentaires si vous hébergez sur un serveur partagé non approuvé et/ou mal configuré - cela pourrait amener d'autres personnes sur la même machine à lire vos données de session. Dans ce cas, vous pouvez stocker vos données de session dans une base de données en réécrivant votre gestionnaire de session. Il suffit de chercher session handler mysql sur les intertubes, je suis sûr qu'il y a assez de solutions prêtes à l'emploi. et ne stockez pas d'informations sensibles comme des mots de passe dans la session, mieux vaut faire une requête chaque fois que vous avez besoin de le comparer. À part ça ... utilisez ssl/https pour la gestion des connexions et des utilisateurs, donc aucun mot de passe en clair n'est transféré. Ne stockez que pw-hashes avec du sel dans la base de données. ne laissez personne voir les mots de passe (ce qui signifie: ne les imprimez jamais en HTML ou par courriel). n'utilisez pas les valeurs auto_increment pour les identifiants que l'utilisateur peut voir (et donc deviner). ok, c'est déjà hors de la portée des questions.

+0

'et ne stockez pas les informations sensibles comme les mots de passe dans la session, mieux vaut faire une requête chaque fois que vous avez besoin de le comparer.' - Eh bien, je pense qu'il est plus rapide de stocker une version cryptée unidirectionnelle du mot de passe (md5 + hash), et de le vérifier à la place de refaire la requête à la db encore et encore – Strae

+0

vrai, mais normalement vous n'avez pas besoin de vérifier le mot de passe sur chaque page vue, seulement sur # 1: se connecter et # 2: le changer (si vous demandez à l'utilisateur de fournir le pw actuel pour en définir un nouveau). pour # 1 vous devez interroger la base de données, et # 2 ne se produit pas très souvent, de sorte que le surcoût supplémentaire est négligeable. – stefs

Questions connexes