Bonjour,
J'ai pas fait de site web depuis très longtemps.
Je suis en train de m'y remettre, et j'ai choisi PHP comme langage pour m'autoformer.
Ce que je cherche est cependant plus généraliste : je cherche avant tout une méthode fiable et sécurisée pour authentifier mon utilisateur.
J'ai donc créé un formulaire d'inscription, qui stocke dans la base de données un hash du mot de passe :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $name = $_POST['name']; $login = $_POST['login']; $password = $_POST['password']; $cost = 10; $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); $salt = sprintf("$2y$%02d$", $cost) . $salt; $hash = crypt($password, $salt);
Maintenant, arrive le moment où l'utilisateur saisi dans un formulaire son login/password pour s'authentifier.
En soit, pas de problème.
Mais ce que je cherche ensuite à faire, c'est de faire en sorte que l'utilisateur reste authentifié sans pour autant utiliser de session.
En effet, il fut une lointaine époque où j'ai usé et abusé des variables de session, et j'ai rapidement compris que leur existence n'était d'une hérésie :
- en termes de performances : objets persistants en mémoire détruits de façon peu fiable
- en termes de sécurité : quelques backspace bien sentis et on peut aisément mettre à mal un code mal goupillé et se faire passer pour ce qu'on n'est pas
- en termes de lisibilité du code (et donc maintenance) : on sait jamais trop quand une variable de session est utilisable ou non
Du coup, jusqu'à présent, je stockais un cookie de session (cookie sans date de fin, détruit au moment de la fermeture du navigateur) qui contenant uniquement login/mot de passe, et à chaque page je vérifiais les autorisations de l'utilisateur.
Mais ça c'était valable à l'époque où le mot de passe n'était pas crypté en base :
- le coût de l'encryption est trop élevé pour se le permettre à chaque chargement de page
- quel est l'intérêt de crypter le mot de passe dans la base (à priori sécurisée) si on ne le crypte pas dans la trame HTTP (je n'utilise pas de SSL)
Du coup je patauge un peu.
Quelle solution élégante permettrait de gérer ça proprement ?
Voici quelques solutions qui me sont venues en tête :
- Calculer un hash simple du login/passe et les utiliser dans le cookie : comme ça pas de mot de passe en claire, mais pas d'encryption lourde à chaque page
- Générer une clé (GUID par exemple) aléatoire du moment de d'authentification et l'utiliser dans le cookie par la suite jusqu'à la prochaine connexion (c'est à peu près le système du sessionid)
- Utiliser côté client un système à clé multiple avec authentification en plusieurs étapes. C'est à dire pour chaque utilisateur, créer une matrice de nombre en fonction du login/passe, et la générer aussi à la volée côté client. Ensuite, à chaque chargement de page, faire en sorte de le serveur demande patte blanche en demandant une valeur de la matrice. Ça me semble un peu lourd, puisque ça demande deux échanges avec le serveur pour chaque chargement de page... Pourtant ça évite qu'un petit malin qui récupère une unique trame HTTP puisse percer la sécurité du site (sauf s'il tombe au bon moment, quand on échange le login/pass).
Une autre idée ?
Partager