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>