• 4 heures
  • Facile

Contrôlez les mots de passe

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Un point fondamental de la sécurité informatique n'est autre que le mot de passe. Bien que nous l'ayons protégé, il est possible qu'il soit tout simplement... trop faible !

Beaucoup d'internautes utilisent un mot de passe trop faible, et cela représente une grande partie des attaques. Il est en effet beaucoup plus simple de tester quelques combinaisons de mot de passe que de s'attaquer directement au serveur ! Il est donc de votre devoir de guider vos brebis en les obligeant à utiliser un mot de passe raisonnablement compliqué. 11

Étape 1 : la longueur de la chaîne

Pour commencer, il est essentiel de fixer une longueur minimale de mot de passe. Généralement, elle est comprise entre 6 et 8 caractères, à vous de choisir ce qui vous semble le mieux.

Il est également possible de fixer une longueur maximale, non pas par souci de sécurité, mais pour des raisons de compatibilité avec votre application web. Un mot de passe de plus de 50 caractères est extrêmement rare, voire louche. Une fois de plus, à vous de juger ce qui est préférable.

Pour ce qui est du code PHP, rien de bien complexe :

<?php

$password = $_POST['password'];

if (strlen($password) < 6) {
    echo "Mot de passe trop court !";
}

?>

On récupère le mot de passe entré par l'utilisateur et on détermine sa longueur grâce à la fonctionstrlen(). S'il comporte moins de 6 caractères, on le rejette.

Pour rendre votre formulaire plus interactif, vous pouvez fixer une longueur minimale dans votre balise input en HTML grâce aux attributspattern etrequired.

<input pattern=".{6,}"   required title="6 caracteres minimum">

Gardez cependant à l'esprit qu'une vérification HTML n'apporte aucune sécurité. C'est pour ça qu'elle doit impérativement être  couplée à une vérification côté serveur.  Elle apporte une dimension visuelle et guide l'utilisateur, mais rien de plus.

Étape 2 : le choix des caractères

Bon, pour commencer, voilà une liste non exhaustive des grandes familles de caractères :

  • les lettres minuscules (a-z) ;

  • les lettres majuscules (A-Z) ;

  • les chiffres (0-9) ;

  • les caractères spéciaux (#, @, &...).

L'idéal serait un mot de passe qui mixerait ces différentes familles. Il faut malgré tout voir les choses en face : avoir toutes les familles dans son mot de passe est très contraignant (mémorisation, accès clavier pour certains caractères spéciaux...). Ne le rendez obligatoire qu'en cas de grande nécessité.

Pour tester la présence de ces différents caractères, quoi de mieux qu'une bonne vieille expression régulière (alias regex) ? ;)

<?php

    $password = $_POST['password'];
 
    if (preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W)#', $password)) {
        echo 'Mot de passe conforme';
	}
	
    else {
        echo 'Mot de passe non conforme';
	}	
?>

Si vous n'êtes pas familiers avec les expressions régulières, ce n'est pas grave. Nous allons décomposer la chaîne.

  • La fonctionpreg_match() permet de rechercher une ou plusieurs occurrences d'un caractère. On l'utilise ici pour tester la présence de nos différentes familles dans la chaîne$password.

  • Le symbole# délimite le regex.

  • Le symbole^ placé au début indique tout simplement le début de la chaine.

  • (?=.*[a-z]) permet de tester la présence de minuscules.

  • (?=.*[A-Z]) permet de tester la présence de majuscules.

  • (?=.*[0-9]) permet de tester la présence de chiffres.

  • (?=.*\W) permet de tester la présence de caractères spéciaux (\Windique ce qui ne correspond pas à un mot).

Vous pouvez modifier ce regex à votre guise, il vous suffit de supprimer les parenthèses qui correspondent aux caractères que vous ne souhaitez pas tester.

Par exemple, si vous ne souhaitez pas imposer de caractère spécial, il vous suffit de supprimer la parenthèse correspondante, soit :(?=.*\W).
Enfantin ! :)

Notez qu'il est également possible de tester la longueur de la chaîne dans une expression régulière. Une fois de plus, rien de très compliqué :

<?php
	
    $password = $_POST['password'];
 
    if (preg_match('#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).{6,}$#', $password)) {
        echo 'Mot de passe conforme';
	}
	
    else {
        echo 'Mot de passe non conforme';
	}	
?>

Le caractère$ indique la fin de la chaîne. Le chiffre 6 définit la longueur minimale de caractères que la chaîne doit admettre pour être validée. On vérifie donc ici que la chaîne se termine sur au moins 6 caractères.

Cette technique nous évite d'avoir recours à la fonctionstrlen() et permet donc d'alléger un peu notre code.

Étape 3 : la vérification de la popularité

Certains mots de passe sont connus des hackers, et sont très rapides à casser avec un dictionnaire d'attaque. Il serait donc commode de vérifier que le mot de passe de l'utilisateur ne soit pas présent dans l'un ou l'autre de ces dictionnaires !  Il en existe de toutes les tailles et de toutes les formes, à vous de vous procurer celui qui vous convient le mieux.

Côté code, on pourrait mettre en place quelque chose qui ressemble à ça :

<?php

// On ouvre le dictionnaire en lecture seule
$handle = fopen('dictionnaire.txt', 'r');

// Variable qui enregistre les mots extraits du fichier
$buffer = "";

// On récupère le mot de passe de l'utilisateur
$chaine = $_POST['password'];

if ($handle)
{
	// Tant que l'on est pas à la fin du fichier
	while (!feof($handle) AND ($buffer != $chaine))
	{
		
		$buffer = fgets($handle);

	}
	
	if ($buffer == $chaine) {
	    // Le mot de passe est dans le fichier, il faut le changer !
	}
	
	// On ferme le fichier
	fclose($handle);
}
?>

C'est un peu le même principe que l'attaque d'un hash par force brute. Vous vous mettez à la place du hacker pour voir comment il procède, et vous protégez l'utilisateur.

Étape 4 : la période de validité

On pourrait également choisir de fixer à l'avance une durée de validité pour notre mot de passe. Veillez cependant à ne pas mettre une plage trop courte, vous risqueriez d'échauffer vos utilisateurs. Changer de mot de passe est très contraignant, ne serait-ce que pour des raisons de mémorisation. Demander un changement plus régulier qu'une fois tous les 6 mois semble très ambitieux. Une fois de plus, tout dépend de l'objectif de votre site.

Je ne vais pas mettre de code de démonstration, il vous suffit d'insérer une date d'expiration lors de l'inscription et de vérifier que cette date ne soit pas dépassée à chaque connexion de l'utilisateur. Il vous faudra ensuite créer un formulaire de changement de mot de passe qui vérifiera que le nouveau mot de passe est correctement formé et qu'il n'est pas identique au précédent (comparaison de hash par exemple). Une fois mis à jour, le script définit la nouvelle date d'expiration du mot de passe.

Étape 5 : l'information de vos utilisateurs

Il peut être intéressant de mettre en place – dans le formulaire d'inscription – une rubrique spécialement consacrée à votre politique de mot de passe. Les utilisateurs seraient ainsi informés sur les dangers et les règles que vous avez fixé pour protéger leurs données au maximum.

Voilà une liste non exhaustive des points que vous pourriez développer :

  • la composition attendue d'un bon mot de passe (majuscules, minuscules, chiffres...) ;

  • la période de validité du mot de passe ;

  • les formes de mot de passe à éviter (prénoms de proches, dates...) ;

  • les choses à ne pas faire avec son mot de passe (ne jamais le divulguer, le noter, ne pas utiliser le même mot de passe pour plusieurs sites...) ;

  • l'importance de changer immédiatement son mot de passe au moindre soupçon de vol ;

  • la nécessité de s'assurer d'être déconnecté avant de quitter un poste qui n'est pas le sien (fermer le navigateur ne suffit pas toujours) ;

  • la confirmation que l'équipe du site ne demandera jamais son mot de passe à un utilisateur ;

  • l'assurance que les mots de passe ne sont pas stockés en clair : même les membres ayant accès aux bases de données du site ne peuvent pas les obtenir ;

  • etc.

Il est également important de tenir informés vos utilisateurs du moindre changement dans cette politique (par mail par exemple). C'est cette transparence et cette rigueur qui vous permettront d'instaurer une relation de confiance avec vos utilisateurs ! :ange:

Exemple de certificat de réussite
Exemple de certificat de réussite