Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

PHP 5.5.0 : l'avancement du système d'inscription/connexion

Par Anaïde TCHATALIAN Publié le 18/10/2015 à 22:32:51 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Cet article a pour but de vous présenter les nouvelles fonctions de PHP 5.5 au niveau du hash et du salage (changement du mot de passe avec un hash différent) pour l'inscription ainsi que la vérification de l'identification.

Depuis PHP 5.5, il est possible de laisser PHP le soin de "hasher" et de "saler" en toute sécurité les inscriptions et les identifications avec des lignes de code très simplifiées.

La théorie

L'inscription

Le nom de la fonction est password_hash. Elle prend en compte 2 paramètres :

- Le mot de passe

- La constante définissant l'algorithme à utiliser

Une fois les 2 paramètres pris en compte, elle renvoie un string avec le mot de passe qui sera sous la forme hashée et salée.

La constante du mot de passe supporte actuellement :

- PASSWORD_DEFAULT

- PASSWORD_BCRYPT

Ces 2 fonctions font la même chose, à la différence que PASSWORD_DEFAULT garantit d'avoir de meilleurs algorithmes si jamais BCRYPT devient à l'avenir obsolète.

PASSWORD_BCRYPT est l'algorithme de hash actuellement utilisé. Comme tout le monde le sait, chaque chose fait son temps. Et PASSWORD_BCRYPT deviendra un jour ou l'autre dépassée. C'est pour cela que PASSWORD_DEFAULT vient à le remplacer par précaution.

Si une erreur survient lors du hashage, la variable $hash ne vaudra pas le hash mais une valeur booléenne "False". Ceci permettra de tester si cela a foncitonné ou non.

La vérification et la gestion des connexions

La seconde fonction se prénomme PASSWORD_VERIFY.

Son nom est comme nous l'entendons : elle permet de vérifier l'authentification du mot de passe.

Cette fonction prend 2 paramètres :

- Le mot de passe entré (en clair et non hashé)

- Le hash qui a été obtenu lors de l'inscription à l'aide du PASSWORD_HASH.

La pratique

Pour commencer, votre ordinateur doit posséder un serveur Web, PHP 5.5.0 ou une version ultérieure et une base de données.

Votre base de données doit contenir une table contenant les mots de passe ainsi que les noms des utilisateurs. Exemple :

La prochaine étape consistera à créer 3 fichiers PHP :

- Le premier s'appellera index.php. Il contiendra la page à afficher incluant les formulaires d'inscription et de connexion.

<!DOCTYPE html>
<html>
	<head>
	<title>Exemple - Mot de passe</title>
	</head>
	<body>
	<h2>Enregistrement</h2>
	<form action="register.php" method="POST">
		<label>Identifiant :</label>
		<input type="text" name="username" required /><br /><br />
		<label>Mot de passe :</label>
		<input type="password" name="password" required /><br /><br />
		<label>Retapez mot de passe :</label>
		<input type="password" name="password2" required /><br /><br />
		<input type="submit" />
	</form>
	<br /><hr />
	<h2>Connexion</h2>
	<form action="login.php" method="POST">
		<label>Identifiant :</label>
		<input type="text" name="username" required /><br /><br />
		<label>Mot de passe :</label>
		<input type="password" name="password" required /><br /><br />
		<input type="submit" />
	</form>
	</body>
</html>

- Le deuxième s'appellera register.php. Il contiendra la fonction pour enregistrer un nouvel utilisateur dans la base de données :

<?php
//Connexion à la base de données
//(via PDO, utilisez la méthode de votre choix comme le type de base de données de votre choix)
$pdo = new PDO(
    'mysql:host=localhost;dbname=test2', 'root', '');
	
//On vérifie que l'utilisateur a bien envoyé les informations demandées 
if(isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["password2"])){
	//On vérifie que password et password2 sont identiques
	if($_POST["password"] == $_POST["password2"]){
		//On utilise alors notre fonction password_hash :
		$hash = password_hash($_POST["password"], PASSWORD_DEFAULT);
		//Puis on stock le résultat dans la base de données :
		$query = $pdo->prepare('INSERT INTO users (username, password) VALUES(:username, :password);');
		$query->bindParam(':username', $_POST["username"]);
		$query->bindParam(':password', $hash);
		$query->execute();
		header('Location: index.php');
		exit();
	}
}
?>

- Le dernier s'appellera login.php. Il utilisera la fonction pour authentifier un utilisateur :

<?php
//Connexion à la base de données
//(via PDO, utilisez la méthode de votre choix comme le type de base de données de votre choix)
$pdo = new PDO(
    'mysql:host=localhost;dbname=test2', 'root', '');
	
//Nous vérifions que l'utilisateur a bien envoyé les informations demandées 
if(isset($_POST["username"]) && isset($_POST["password"])){
	//Nous allons demander le hash pour cet utilisateur à notre base de données :
	$query = $pdo->prepare('SELECT password FROM users WHERE username = :username');
	$query->bindParam(':username', $_POST["username"]);
	$query->execute();
	$result = $query->fetch();
	$hash = $result[0];
	
	//Nous vérifions si le mot de passe utilisé correspond bien à ce hash à l'aide de password_verify :
	$correctPassword = password_verify($_POST["password"], $hash);
	
	if($correctPassword){
		//Si oui nous accueillons l'utilisateur identifié
		echo "Bienvenu ".$_POST["username"];
	}else{
		//Sinon nous signalons une erreur d'identifiant ou de mot de passe
		echo "login/password incorrect";
	}
}
?>

Voici le résultat du index.php :

Si un utilisateur parvient donc à s'identifier après s'être inscrit, il verra alors ce message :

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels