Classe NoBF :: Anti Brute Force rapide et léger
Accueil > Portions de codes > Classes PHP > Classe NoBF :: Anti Brute Force rapide et léger
Portion de code ajouté par sky le 09-08-2010
Une classe qui gère de façon très simple la détection d'attaque de type Brute Force en PHP.
Très rapide, léger et robuste !
Le système repose l'utilisation de fichiers liés au login/email.
On en parle sur le forum ici :
anti brute force en PHP
Une attaque dite 'par Brute Force' selon Wikipédia :
L'attaque par force brute est une méthode utilisée en cryptanalyse pour trouver un mot de passe ou une clé. Il s'agit de tester, une à une, toutes les combinaisons possibles. Cette méthode de recherche exhaustive ne réussit que dans les cas où le mot de passe cherché est constitué de peu de caractères. Ces programmes tentent toutes les possibilités de mot de passe dans un ordre aléatoire afin de berner les logiciels de sécurité qui empêchent de tenter tous les mots de passe dans l'ordre.
Exemple d'utilisation de la classe NoBF (No Brute Force) :
<?php
$deny_access = NoBF::bruteCheck($email);
if($deny_access == true)
{
exit('Trop de tentative de connexion détectés.');
}
else
{
// connexion
// ...
if($connected == false)
{
echo 'Mauvais login/mot de passe.';
NoBF::addTentative($email);
}
}
?>
Classe PHP anti brute force :
<?php
define('BF_TIME_LAPS', (60*5)); // laps de temps
define('BF_DIR', './bruteforce/'); // répertoire de stockage
define('BF_NB_TENTATIVE', 5); // 5 tentative tous les TIME_LAPS
class NoBF{ // No Brute Force
public function __construct() {
/* */
}
/*
* Test si le nbr de tentative n'exède pas BF_NB_TENTATIVE
* dans le laps de temps défini avec BF_TIME_LAPS
*/
public function bruteCheck($email)
{
$filename = BF_DIR . $email . '.tmp';
$deny_access = false;
if(file_exists($filename))
{
$infos = NoBF::fileToArray($filename);
$nb_tentatives = count($infos);
$premiere_tentative = $infos[0];
if($nb_tentatives < BF_NB_TENTATIVE)
$deny_access = false;
elseif($nb_tentatives > BF_NB_TENTATIVE && (BF_TIME_LAPS + $premiere_tentative) > time())
$deny_access = true;
else
$deny_access = false;
}
return $deny_access;
}
public function addTentative($email)
{
$filename = BF_DIR . $email . '.tmp';
$date = time();
if(file_exists($filename))
$infos = NoBF::fileToArray($filename);
else
$infos = array();
$infos[] = $date;
NoBF::arrayToFile($filename, $infos);
}
/*
* Permet de supprimer les enregistrements trop anciens
*/
public function cleanUp($infos)
{
foreach($infos as $n => $date)
{
if((BF_TIME_LAPS + $date) < time())
unset($infos[$n]);
}
return array_values($infos);
}
/*
* Récupère les infos du fichier et le sretourne unserialisé
*/
public function fileToArray($filename)
{
$infos = unserialize( file_get_contents($filename) );
$infos = NoBF::cleanUp($infos);
return $infos;
}
/*
* Enregistre les infos dans le fichier serialisé
*/
public function arrayToFile($filename, $data)
{
$file = fopen ($filename, "w");
fwrite($file, serialize($data) );
fclose ($file);
return true;
}
}
?>
Cette classe est utilisé avec la classe de
connexion sécurisé.
Ceci est ma première tentative.
Merci d'avance pour vos retours.
Commentaires
abderrahimstar le 18-11-2010
merci mon frere