Éviter les attaques de force brute

Une attaque de force brute est le nom de l'action effectué sur un site web visant à tester avec un logiciel des milliers, voir des millions de mots de passe jusqu'à trouver le bon. C'est un robot qui essaie aléatoirement des mots de passe afin de se connecter au site web.

Personne ne peut réellement empêcher un robot d'effectuer ces actions, mais il est possible par contre de réduire et décourager les pirates.

Les mots de passe complexe

Une des premières solutions pour augmenter la sécurité de son site web est d'obliger ses membres à créer des mots de passe plus complexe. Par exemple, un minimum de 8 caractères, contenant des chiffres et des lettres. Cela rendra la tâche du robot beaucoup plus complexe.

Bloquer l'accès au formulaire de connexion

Avec les variables session, il est possible d'empêcher l'accès au formulaire, pour un certain temps, après certaines tentatives.

Premièrement, initialisons une variable de session à 0 :


if(!isset($_SESSION['connexion']))
	{
		$_SESSION['connexion'] = 0;
	}

Donc, par la suite, nous pourrions choisir de bloquer l'accès au formulaire s'il y a eu plus de 5 mauvaises tentatives de connexion.

Maintenant, nous devons créer l'action qui comptera le nombre de mauvaises connexions. Nous ajouterons 1 à notre variable de session à chaque tentative.

Après avoir vérifier que le formulaire de connexion est bien été validé, exemple :


if(!empty($_POST['pseudo']) && !empty($_POST['password']))

Vérifiez maintenant si les identifiants envoyés peuvent être validés, ou si on bloque l'accès au formulaire.


if($_SESSION['connexion'] < 5)
	{
		$_SESSION['connexion']++;
			
		// S'il y a eu moins de 5 tentatives de connexion, on vérifie			
		// si on peu se connecter avec le  mot de passe et l'identifiant 
		// envoyé
	}
else
	{
		// Si l'utilisateur arrive ici, c'est qu'il a tenté 5 connexions 
		// qui ont échoué empêchons le d'accéder au 
		// formulaire pendant 15 minutes.

		$_SESSION['time'] = time() + 60*15; // 60 secondes * 15..

		// ensuite, on remet le compteur de connexion à 0, pour 
		// permettre de tenter 5 nouvelles tentative de connexion une		
		// fois le temps écoulé

		unset($_SESSION['connexion']);
	}

Maintenant, voici le code pour cacher le formulaire s'il a été bloqué :


if(isset($_SESSION['time']))
	{  // on vérifie si le nombre enregistré est inférieur au time actuel
		if($_SESSION['time'] < time()) 
			{
				// Ici on affiche le formulaire
			}
		else
			{
			  // le 15 minutes n'a pas été écoulé, on indique 
			  // à l'utilisateur qu'il a tenté trop de connexion			
			}
	}
else
	{
	  // ici, on affiche le formulaire qui s'affiche si la session time 
	  // n'est pas été initialisé
	}

Enregistrer et bloquer l'adresse IP

Il pourrait être également intéressant d'enregistrer et de bloquer complètement l'adresse IP qui a tenté les connexions abusives. Cela bloquerait également le formulaire si le pirate fermait la session. Pour ce faire, voici comment procéder :


$IP = $_SERVER["REMOTE_ADDR"];
$time = time() + 60*15; 
// nous allons maintenant plutôt insérer le time dans la base de données

// ensuite, insérons les données dans la table

mysql_query("INSERT INTO laTable(IP,date,time) VALUES ('$IP', NOW(), '$time')");

// Le NOW() indique la date de l'insertion. Il doit être associé à un 
// champ DATE dans votre base de données

Maintenant, modifions un peu l'accès à notre formulaire de connexion.

Voici l'ancien code :


if(isset($_SESSION['time']))
	{  // on vérifie si le nombre enregistré est inférieur au time actuel
		if($_SESSION['time'] < time()) 
			{
				// Ici on affiche le formulaire
			}
		else
			{
			  // le 15 minutes n'a pas été écoulé, on indique 
			  // à l'utilisateur qu'il a tenté trop de connexion			
			}
	}
else
	{
	  // ici, on affiche le formulaire qui s'affiche si la session time 
	  // n'est pas été initialisé
	}

Et maintenant, le nouveau :


// ici, on vérifie si l'IP est contenu dans la table et le 
// temps qu'il lui est associé.

$requete = "SELECT * FROM laTable WHERE ip = '".$_SERVER["REMOTE_ADDR"]."'";
$req_exec = mysql_query($requete) or die(mysql_error());
$resultat = mysql_fetch_array($req_exec);	

if($resultat['IP'] == $_SERVER["REMOTE_ADDR"])
	{  // on vérifie si le nombre enregistré est inférieur au time actuel
		if($resultat['time'] < time()) 
			{
				// ici on affiche le formulaire
			}
		else
			{
			  // le 15 minutes n'a pas été écoulé, on indique 
			  // à l'utilisateur qu'il a tenté trop de connexion			
			}
	}
else
	{
		// ici, on affiche le premier formulaire
	}

Et voilà, avec ces astuces, vous avez maintenant la possibilité d'éviter les attaques de force brute.


Vous avez aimé cet article? Partagez-le!