Objectif
Création des utilisateurs
Le chiffrement d'une chaîne de caractère est effectuée grâce à la méthode password_hash
(avec la chaîne de caractères en argument).
Les utilisateurs seront stockés dans un tableau associatif (clé : nom d'utilisateur, mot de passe : valeur) qui sera sérialisé dans un fichier.
La sérialisation utilisera la fonction serialize
.
Utilisation d'un fichier :
// Ouverture d'un fichier en écriture (w) avec la fonction fopen $fichier = fopen("/tmp/users.txt", "w"); // Ecriture dans le fichier précédement ouvert fwrite($fichier, "Données à écrire"); // Important : fermer le flux vers le fichier fclose($fichier);
On utilisera par exemple un script exécuté en ligne de commande :
$ php createUsers.php
Formulaire auth.php
Vérification de l'authentification : verification.php
Ce fichier comporte la fonction verifier($identifiant, $motDePasse)
qui compare les mots de passes chiffrés (il ne peuvent pas être déchiffrés). Pour comparer deux chaînes chiffrées, on utilisera le résultat de password_hash
comme grain de sel. On utilisera alors la fonction password_verify
// je dispose déjà de $motDePasseChiffre if (password_verify($motDePasseAVerifier, $motDePasseChiffre)) { echo "Mot de passe correct !";
Lecture dans fichier :
// Ouverture d'un fichier en lecture (r) avec la fonction fopen $fichier = fopen("/tmp/users.txt", "r"); // Récupération du contenu $contenu = fgets($fichier); // Important : fermer le flux vers le fichier fclose($fichier);
Ce fichier sera aussi capable de traiter les données du formulaire auth.php. Si l'authentification est correcte, l'identifiant utilisé est conservé en session.
Contenu : contenu.php
verification.php
<?php session_start(); // Traitement des informations du formulaire if(isset($_POST['identifiant']) && isset($_POST['motDePasse'])) { $identifiant = $_POST['identifiant']; $motDePasse = $_POST['motDePasse']; if(verifier($identifiant, $motDePasse)) { $_SESSION['identifiant'] = $identifiant; $message = "Bienvenue"; } else { $message = "Erreur<br><a href=\"auth.php\">Retour</a>"; } } else { $message = "Erreur<br><a href=\"auth.php\">Retour</a>"; } // Fonction de comparaison des mots de passe chiffrés function verifier($identifiant, $motDePasse) { if(($identifiant == null) || ($motDePasse == null)) return null; $fichier = fopen("/tmp/users.txt", "r"); $users = unserialize(fgets($fichier)); fclose($fichier); return (isset($users[$identifiant])) && (password_verify($motDePasse, $users[$identifiant])); } ?> <html> <head><title>Identification</title></head> <body> <p> <?php echo $message ?> </p> </body> </html>
test.php
<?php include 'verification.php'; echo "Test : " . verifier("riri", "azerty") . "\n"; echo "Test : " . verifier("riri", "azertyuiop") . "\n"; ?>
contenu.php
<?php session_start(); // Contenu uniquement accessible si l'identifiant est stocké // en session suite à une authentification réussie if(! isset($_SESSION["identifiant"])) { header('Location: auth.php'); // Redirection vers le formulaire d'authentification exit(); } else{ // Notez la syntaxe plus compacte pour inclure de l'HTML dans du PHP echo <<< _END <html> <head><title>Ressource</title></head> <body> <p>Accès</p> </body> </html> _END; } ?>
createUsers.php
<?php // Création des données $users = array(); $users["riri"] = password_hash("azerty", PASSWORD_DEFAULT); $users["fifi"] = password_hash("poiuyt", PASSWORD_DEFAULT); $users["loulou"] = password_hash("lfkjgh", PASSWORD_DEFAULT); // Ecriture dans le fichier $fichier = fopen("/tmp/users.txt", "w"); fwrite($fichier, serialize($users)); fclose($fichier); ?>
auth.php
<html> <head> <title>Identification</title> </head> <body> <form action="verification.php" method="post"><pre> <label for="identifiant">Identifiant</label> <input type="text" name="identifiant"><br> <label for="motDePasse">Mot de passe</label> <input type="password" name="motDePasse"><br> <input type="submit" value="Valider"> </pre></form> </body> </html>