Anti flood sans la librairie gd

Soyez le premier à donner votre avis sur cette source.

Vue 6 170 fois - Téléchargée 459 fois

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

Ajouter un commentaire

Commentaires

Messages postés
57
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
6 septembre 2006

J'ai oublié de vous passer l'adresse désolé.
la voici: http://www.phpcs.com/code.aspx?ID=39397
++
Messages postés
57
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
6 septembre 2006

Re bonjour tout le monde!
Je viens de poster une nouvelle source, que j'ai codé juste la nuit, elle traite encore de l'anti-flood sans gd..eh oui le petit marcel il faut le porteger à n'importe quel prix! ;P
Suite à vos remarques et critiques (merci) et surtout la dernière suggestion de masternico, l'idée de l'application falsh, j'ai donc fait un petit mélange flash/php très basique et j'aimerai bien si vous y jetter un coup d'oeil pour vos critiques et essayer de l'améliorer.
Et pour celle là, si j'aurai plus de temps, j'essayerai de voir comment appliquer l'idée de malik, sinon ça reste comme ça pour l'instant.
++
Messages postés
487
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011

je passais par la et lisais tout vos commentaires.
Bien que le sujet de la sécurité aurait pu faire l'objet d'un post à part, je voulais répondre à Grenard qui disait qu'un robot ne pouvait déchiffrer facilement la zone chiffrée.
Il est une appliquation que pratiquement tout détenteur de scanner possède : un reconnaisseur de caractères qui te lit une page de livre et la transcrit en fichier texte modifiable. Si un tel programme fonctionne sur l'ordi des communs des mortels, alors imagine ce que peut faire le même programme sur l'ordi d'un hacker acharné et débrouilard. Il lui suffit juste de "scanner" la portion de l'écran ou apparait l'image chiffrée et optient en retour le numéro correspondant.
Donc même si l'idée de ne pas utiliser la GD pour faire son affaire est interessante, cela demandera un peut plus que de simples images de chiffres, car même si le but est de proteger le petit marcel en maillot de bain (lol, je l'ai trouvée excelente celle la), le hacker finira par s'en occuper car son but est de montrer qu'il est plus fort que les autres... Et comme tu l'empêche de passer à son aise, il forcera le passage, peut importe ce qui se trouve au bout... juste pour le fun...
F BNKCM ==> j'espère que tu n'as pas baissé les bras car l'idée est interessante. Il faudrait remplacer les images par une application flash qui afficherait un piaf sur un arbre, et il faudrait pouvoir répondre s'il se trouve sur la branche, sur la racine, etc... comme l'application flash est une vidéo, cela complique la tâche d'un ou d'une hackeuse (pourquoi pas, on se les imagine toujours binoclar et moche comme des poux... mais c'est peut être une petite pépé roulée comme une déesse? he he he) qui s'attache à déchiffrer une image fixe. De plus, il faudrait un timer de temps de réponse pour éviter que le robot n'ai trop de temps pour répondre à la question...
A+
Messages postés
57
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
6 septembre 2006

Salut,
Anthomicro et Psykocrash => Alors en fin de compte mon petit code devient inefficace :(
Je suis d'accord, mais pour un site sans la GD, c'est peut être une solution efficace surtout si on la combine avec l'idée que Malik7934 a proposé un peu plus haut.
Si j'ai un peu de temps je pourrais m'y pencher dessus.
Psykocrash => Les critiques constructives sont toujours les bienvenues (même si elles sont vexantes des fois..snif...) ;)
Merci pour votre contribution.
++
Messages postés
240
Date d'inscription
vendredi 14 juin 2002
Statut
Membre
Dernière intervention
17 mars 2009

Tout à fait d'accord avec toi :)
Mais bon je crois qu'il faudrait qu'on en reste là, sinon il va être dégouté d'avoir posté sur phpcs :p
f bnkcm c'est pas toi qu'on critique, c'est la méthode !!
Afficher les 31 commentaires

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.