Anti flood sans la librairie gd

Description

Une petite class pour remplacer la librairie GD pour ce qui est de l'anti-flood. Lorsque cette librairie est désactivée (souvent chez les hébergeurs gratuits), on ne peut pas créer des images aléatoires. Cette class le fait et y a avec une autre pour vérifier ce qui est saisi.
L'idée c'est de générer un code (qu'il faut saisir) dont chaque caractère est représenté par une image contenant le même caractère (dans mon exemple c'est des chiffres) mais avec un nom ("xxxxx.jpg") différent à chaque fois, par exemple l'image qui contient le chiffre "6" peut avoir comme nom "xgrt.jpg" ou bien "jhfg.jpg"... Le nombre de carctères pour ça est contrôlable aussi.
A vous de tester et dites ce que vous en pensez ou comment l'améliorer.

Source / Exemple :


<?php
 ////////////////////////////////////////////////////////////////////////////////\
//										//
//	Nom du code		: Anti_Flood_Sans_GD (Class php)		//
//	Version    		: 1.0						//
//	Date de création: 17 / 08 / 2005					//
//	Auteur   	 	: FBNKCMaster <-|| Farid  BEN KACEM ||->	//
//	E-mail 			: FBNKCMaster@hotmail.com			//
//										//
//	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  	//
//										//
//	Remerciements à	:							//
//			-> 	GRenard pour ses remarques, ses règles		//
//			de la bonnes programmation				//
//			-> 	Arnotic pour l'idée de son code de génération	//
//			de mots	de passe sur cette adresse:			//
//			(http://www.phpcs.com/code.aspx?ID=12787)		//
//			-> 	Tous ceux qui peuvent apporter des critiques	//
//				constructives à cette source			//
//										//
//	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  //
//										//
//	Remarque		:						//
//			Merci de ne pas supprimer cette partie	 		//
//										//
//	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||	//
//										//
//					    ENJOY IT!!!	 			//
//										//
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
## Class anti-flood "anti_flood" ##
## fichier anti_flood.class.php  ##

class anti_flood
{
	var $equiv = array(); //tableau qui contient
	var $decryptage = array(); //tableau qui contient
	var $nv_noms = array(); // tableau des nouveaux noms
	var $dos_img = 'img_flood'; // dossier qui contient les images
	var $dos_sess = 'sess_flood'; // dossier où sera créé un dossier pour chaque session
	var $nbr_carac_code; //Nombre de carctères du code à saisir
	var $nbr_crypt_code; // Nombre de caractères pour crypter les noms originels des images
	var $sess; // la variable de la session
	
	function anti_flood($nbr_car, $nbr_cryp) //le constructeur
	{
		$this->nbr_carac_code = $nbr_car;
		$this->nbr_crypt_code = $nbr_cryp;
		
		$this->sess = session_id(); // On génère un id pour la session
		$this->suppr_dos(); //On vide le dossier des sessions "sess_flood" au cas où la vérification n'est pas faite

		$code = $this->gen($this->nbr_carac_code,'num');
		for($i = 0; $i < $this->nbr_carac_code; $i++) // On fait correspondre chaque caractère à une image à qui on génère un nouveau nom aléatoire à l'aide de la méthode $this->gen()
		{
			$this->attribuer($code{$i}, $this->gen($this->nbr_crypt_code, 'alpha'));
		}
		$this->sess(); // On enregistre toutes les variables (tableaux) pour les traiter lors de la vérification
	}

	
	function suppr_dos() // La méthode pour supprimer les dossiers des sessions créés et leurs fichiers
	{ 
		$dos = opendir($this->dos_sess); 
		while ($fichier = readdir($dos))
		{ 
			$l = array('.', '..'); 
			if (!in_array( $fichier, $l))
			{ 
				if (is_dir($this->dos_sess.'/'.$fichier))
				{
					$s_dos =opendir($this->dos_sess.'/'.$fichier); 
					WHILE($f = readdir($s_dos))
					{
						@unlink($this->dos_sess.'/'.$fichier.'/'.$f); 
					}
					@closedir($s_dos); 
					@rmdir($this->dos_sess.'/'.$fichier);
				}else
				{ 
					unlink($this->dos_sess.'/'.$fichier); 
				} 
			} 
		} 
		@closedir($doss); 
	}
	
	function gen($nbrcar, $car) // La méthode qui génère les codes
	{
		@mkdir($this->dos_sess.'/'.$this->sess, 0777);
		$caracteres = array('num' => '0123456789', 'alpha' => 'abcdefghijklmnopqrstuvwxyz'); 
		$nbr_caracteres = strlen($caracteres[$car]);
		$code = '';
		for($i = 0; $i < $nbrcar; $i++)
		{ 
			$code .= $caracteres[$car]{mt_rand()%$nbr_caracteres}; 
		}
		return $code;
	}
	
	function attribuer($nom_orig, $crypt) // La méthode qui attribue chaque code généré à chaque image qui sera affichée (la méthode qui crypte les noms originels des images affichés)
	{
		if(array_key_exists($nom_orig, $this->equiv)) // Si la clef (qui correspond au nom original de l'image) existe déjà dans notre tableau "$this->equiv"
		{
			// $nom_orig existe déjà, on ajoute "l'ancien" nouveau nom au tableau "$this->nv_noms"
			$this->nv_noms[] = $this->equiv[$nom_orig];
		}else
		{
			// $nom_orig  n'existe pas => donc on ajoute au tableau le code généré à cette clef qui sera son index
			$this->copier_img($nom_orig, $crypt); // On copie l'image avec son nouveau nom crypté
			$this->equiv[$nom_orig] = $crypt;
		}
		$this->decryptage[] = $this->equiv[$nom_orig]; // Un autre tableau "indispensable!" qui contient les codes de toutes les cles (noms des images) à affiché 
	}
	
	function copier_img($nom_orig, $nv_nom) // La méthode qui copie l'image à afficher avec le nouveau nom crypté vers le dossier de la session
	{
		if(copy($this->dos_img.'/'.$nom_orig.'.jpg', $this->dos_sess.'/'.$this->sess.'/'.$nv_nom.'.jpg'))
		{
			// L'image est copiée avec succès donc on ajoute son nouveau nom au tableau "$this->nv_noms"
			$this->nv_noms[] = $nv_nom;
		}else
		{
			// Sinon on affiche une image nom trouvée
			echo '<img src="x.jpg" alt="" />';
		}
	}
	
	function afficher() // La méthode qui affiche les images avec leurs nouveaux noms et emplacement
	{
		foreach($this->nv_noms as $nv_nom)
		{
			echo '<img src="'.$this->dos_sess.'/'.$this->sess.'/'.$nv_nom.'.jpg" alt="" />';
		}
	}
	
	function sess() // La méthode qui enregistre le nom de la session et les tableaux qu'on va traiter dans la class verif_flood.class.php et on les passe par une variable session
	{
		$tableau[] = $this->equiv;
		$tableau[] = $this->decryptage;
		$_SESSION[$this->sess] = $tableau;
	}
}
?>

###################################################

<?php
 ////////////////////////////////////////////////////////////////////////////////\
//										//
//	Nom du code		: Anti_Flood_Sans_GD (Class php)		//
//	Version    		: 1.0						//
//	Date de création: 17 / 08 / 2005					//
//	Auteur   	 	: FBNKCMaster <-|| Farid  BEN KACEM ||->	//
//	E-mail 			: FBNKCMaster@hotmail.com			//
//										//
//	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  	//
//										//
//	Remerciements à	:							//
//			-> 	GRenard pour ses remarques, ses règles		//
//			de la bonnes programmation				//
//			-> 	Arnotic pour l'idée de son code de génération	//
//			de mots	de passe sur cette adresse:			//
//			(http://www.phpcs.com/code.aspx?ID=12787)		//
//			-> 	Tous ceux qui peuvent apporter des critiques	//
//				constructives à cette source			//
//										//
//	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  //
//										//
//	Remarque		:						//
//			Merci de ne pas supprimer cette partie	 		//
//										//
//	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||	//
//										//
//					    ENJOY IT!!!	 			//
//										//
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
## Class de verification "verif_flood" ##
##    fichier verif_flood.class.php    ##

require_once('anti_flood.class.php');
class verif_flood extends anti_flood // On herite de la class mère "anti_flood"
{
	var $code_saisi;
	
	function verif_flood($code) // Le constructeur8
	{
		$this->code_saisi = $code;
		$this->sess = session_id(); // On cherche l'id de la session
		$tableaux = $_SESSION[$this->sess]; // On extrait les tableaux => un tableau multi-dimensionnel
		foreach($tableaux as $v) // On reconstruit les sous-tableaux 
		{
			$st[] = $v; // "st" =  sous-tableau
		}
		$this->equiv = $st[0]; // Là juste pour attribuer le nom à chaque sous tableau pour pas se perdre après...
		$this->decryptage = $st[1];
		
		$this->suppr_dos(); // On vide le dossier des sessions "sess_flood"
		//return $this->verifier(); // On vérifie		
	}
	
	function verifier() // La méthode qui decrypte et verifie le code entré
	{
		$nbr_carac_code = strlen($this->code_saisi);
		//Et là on crypte le code entré: chaque caractère entré correspond à un code qu'on va récupérer dans le tableau d'equivalence "$this->equiv" ayant comme clefs les noms originaux des images
		$crypt = '';
		for($i = 0; $i < $nbr_carac_code; $i++)
		{
			if(isset($this->equiv[$this->code_saisi{$i}]))
			$crypt .= $this->equiv[$this->code_saisi{$i}];
		}
		// On obtient le code crypté qu'on va comparer avec la suite des codes générés pour chaque images... C'est un peu difficil à comprendre du premier coup mais il faut juste méditer c'est simple l'idée!
			
		//Ici on decrypte..non on fait juste sortir et coller les codes générés, de chaque image, du tableau dont j'ai dit "indispensable!"... maintenant je crois que vous compreniez pourquoi ;)
		$decrypt = '';
		foreach($this->decryptage as $v)
		{
				$decrypt .= $v;
		}
		// On obtient la suite des codes les uns après les autres générés
			
		// On compare les deux codes obtenus
		if($crypt === $decrypt)
		{
			// C'est le bon code
			return true;
		}else
		{
			// C'est pas le bon code
			return false;
		}
	}
}
?>

Conclusion :


################### Exemple d'utilisation ######################

################################################################
## la page où s'affichera le code à saisir (par ex: index.php)##
<?php
session_start();
echo '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ANTI-FLOOD SANS GD</title>
</head>
<body>
<div align="center">
';
require_once('anti_flood.class.php');
$anti_flood = new anti_flood(6, 4); // On ainstancie la class avec les deux parmèttres: "6"-> nombre de caractères à saisir "4"-> nombre de caractères pour crypter les noms originels des images
$anti_flood->afficher(); // On affiche les caractères (les images)
echo '
<br />
<form method="post" action="verif_flood.php">
<input type="text" name="flood" /><br />
<input type="submit" value="Valider" />
</form>
</div>
</body>
</html>
';
?>

#################################################
## fichier de verification (verif_flood.php) ##
<?php
session_start();
echo '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ANTI-FLOOD SANS GD</title>
</head>
<body>
<div align="center">
';
if(isset($_POST['flood']))
{
$code = $_POST['flood']; // On récupère le code saisi
require_once('verif_flood.class.php');
$verif = new verif_flood($code); // On instancie la class de verification aveccomme paramèttre le code saisi
if($verif->verifier() === true)
{
echo 'C\'est le bon code!!';
}else
{
echo 'Code invalide!!!';
}
}
echo '
</div>
</body>
</html>
';
?>

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.