Classe anti-spam [MAJ -> V 1.2]

Eléphant du PHP | 451 Messages

24 sept. 2008, 19:04

Bonjour,

Voilà j'ai codé une classe anti-spam facile à utiliser, et il y a plusieurs type de questions (génération de code, questions sur des nombres, questions sur les genres) et si aucun mode n'est définit il y aura un choix aléatoire dans toutes les questions.

Et vous pouvez aussi ajouter des questions à votre guise avec un système d'ajout simple qui est expliqué plus bas.

Voilà comment l'utiliser:
<?php

/* Insertion du fichier: */
include('class_captcha.php');


/* Déclaration de la classe: */
$captcha = new Captcha('', '1 ou 2 ou 3');

/*
1 ou 2 ou 3 correspond au type de captcha que vous désirez utiliser.

Légende:
	1 => Questions sur les nombres
	2 => Question sur les genres
	3 => Gestion de code automatique
*/


/* Affichage du captcha: */
echo $captcha->self_Output_Html();


/* Vérification du captcha: */
$captcha->captcha = $_POST['Captcha'];
$captcha->verif = $_POST['Captcha_Verif'];

if($captcha->self_Verif() == 1)
{
    // Code bon. Envoi du formualaire
}
else
{
    // Code mauvais. Retour au formulaire
}



/* Pour rajouter des questions faites comme la suite: */
$array = array(
		array('la question', 'la réponse'),
		array(' la question', 'la réponse')
);
$captcha = new Captcha($array, '1');

/* A la place du 1 vous pouvez mettre 2. */
/* Mais vous mettez 3 vos questions ne seront plus prises en considérations */
?>
Attention:
Placez bien le code
echo $captcha->self_Output_Html();
A l'endroit on vous souhaitez faire apparaitre l'anti-spam car cette fonction génére le code html associé.

Et voici la classe complète:
<?php
/*----------------------------------------------------
@
@ Filename: Class_captcha.php
@
@ ----------------------------------------------------
@
@ Author: Djtec
@ Url author: http://djtec.ovh.org/
@ Create: 28/09/2008
@ Version: 1.2
@
@ License: http://creativecommons.org/licenses/by-nc-sa/2.5/deed.fr_CA
@
----------------------------------------------------*/

 
class Captcha
{
 
	private $tab;
	private $type_tab;

    var $captcha;
    var $verif;
 
 
    /*
    @ Constructeur de la classe
    */
	public function __construct ($tab = array (), $type_tab)
	{

   	 	// Questions réponses type = 1
		$Type_Number = array(
            array('Combien font 4+4 ?', 'huit'),
            array('Combien font 2+2 ?', 'quatre'),
            array('Combien font 5+5 ?', 'dix'),
            array('Combien font 5-3 ?', 'deux'),
            array('Combien font 5+3 ?', 'huit'),
            array('Combien font 4+2 ?', 'six'),
            array('Combien font 6+2 ?', 'huit'),
            array('Combien font 1+5 ?', 'six'),
            array('Combien font 9-1 ?', 'huit'),
            array('Combien font 10-5 ?', 'cinq')
        );

    	// Questions réponses type = 2
        $Type_Letter = array(
            array('Parmi ces mots, lequel n\'est pas un légume: tomate, courgette, voiture ?', 'voiture'),
            array('Parmi ces mots, lequel n\'est pas un légume: épinard, haricot, avion ?', 'avion'),
            array('Parmi ces mots, lequel n\'est pas un fruit: bannane, vélo, voiture ?', 'vélo'),
            array('Parmi ces mots, lequel n\'est pas un fruit: fraise, tomate, framboise ?', 'tomate'),
            array('Parmi ces mots, lequel n\'est pas un légume: tomate, fraise, courgette ?', 'fraise'),
            array('Parmi ces mots, lequel n\'est pas un instrument de musique: guitare, courgette, piano ?', 'courgette'),
            array('Parmi ces mots, lequel n\'est pas un moyen de transport: tomate, bus, voiture ?','tomate'),
            array('Parmi ces mots, lequel n\'est pas un moyen de transport: tramway, courgette, trotinette ?', 'courgette'),
            array('Parmi ces mots, lequel n\'est pas un instrument de musique: flute, batterie, voiture ?', 'voiture'),
            array('Parmi ces mots, lequel n\'est pas un légume: bol, choux, tomate ?', 'bol')
        );
		
    	// Variables de génération de code
        $this->CodeSize = 8;
        $this->CodeConsonnes = "bcdfghjklmnpqrstvwxz";
        $this->CodeVoyelles = "aeiouy";
        $this->CodeNumeros = "0123456789";

		
		// Sélectionne le type de tableau selon le choix
		if($type_tab == 1)
		{
			$sed_tab = $Type_Number;
		}
		elseif($type_tab == 2)
		{
			$sed_tab = $Type_Letter;
		}
 		
		
		if($type_tab == 3)
		{
			$this->CodeSize = 8;
			$this->CodeConsonnes = "bcdfghjklmnpqrstvwxz";
			$this->CodeVoyelles = "aeiouy";
			$this->CodeNumeros = "0123456789";
			
			$c[0] = $this->CodeConsonnes;
			$c[1] = $this->CodeVoyelles;
			$c[2] = $this->CodeNumeros;
			$c[3] = $this->CodeConsonnes;
			$c[4] = $this->CodeVoyelles;
			$c[5] = $this->CodeNumeros;
			$c[6] = $this->CodeConsonnes;
			$c[7] = $this->CodeNumeros;

			$code = "";
		
			for ($i = 0; $i < $this->CodeSize; $i++)
			{
    			$code.=substr($c[$i],(rand()%(strlen($c[$i]))),1);
			}
				
			$this->_q = 'Veuillez recopier le code suivant: '.$code; 
			$this->_r = sha1($code); 
		}
		else
		{
			// Vérifie si des donnés externes sont remplis
    		if (!empty ($tab))
    		{
				$tab = array_merge($tab + $sed_tab);
			
				$go = count($tab) -1;

				$rand = rand(0, $go);

				$this->_q = $tab[$rand][0]; 
				$this->_r = sha1($tab[$rand][1]); 
    		}
			else
			{
				$go = count($sed_tab) -1;

				$rand = rand(0, $go);

				$this->_q = $tab[$rand][0]; 
				$this->_r = sha1($tab[$rand][1]); 
			}
		}
		
  	}
 
 
    /*
    @ Fonction de génération du code Html
    */
    public function self_Output_Html()
    {
        $html = '<p>'.$this->_q.'</p>
        		 <p><input type="text" size="25" name="Captcha" id="Captcha" />
        		 <input type="hidden" name="Captcha_Verif" id="Captcha_Verif" value="'.$this->_r.'" /></p>';            
 
        return $html;
    }
 
    /*
    @ Fonction de vérification
    */
    public function self_Verif()
    {
        if(sha1($this->captcha) == $this->verif)
        {
            return 1; // Code valide
        }
        else
        {
            return 0; // Code non valide
        }
    }
 
}

?>
J'ai un sujet qui traite cette classe à cette adresse: http://djtec.ovh.org/contribution/?/pos ... i-spam_1.2

Et vous pouvez aussi télécharger les archives:

Télécharger au format .rar
Télécharger au format .zip

Voilà ++
Modifié en dernier par djtec le 30 sept. 2008, 20:54, modifié 7 fois.

Mammouth du PHP | 2937 Messages

24 sept. 2008, 19:06

Pour la classe en elle-même, pourquoi ne pas générer aléatoirement les questions demandant le résultat d'une opération ?

Eléphant du PHP | 451 Messages

24 sept. 2008, 19:13

oui c'est possible aussi mais moi j'ai codé de façon à ce que l'utilisateur choisisse lui même ce qu'il veut comme anti-spam mais je vais le mettre aussi dans le cas ou l'utilisateur ne précise pas ce qu'il veut comme anti-spam.

Merci Victor pour cette bonne idée :D :D


EDIT: Voilà la classe à été mis à jour.

Mammouth du PHP | 19672 Messages

24 sept. 2008, 19:36

Allez une autre mise à jour :
pour mémoire : "pas un légumes" : "un" = singulier :arrow: pas de "s" à "légume"

Enfin bon, je dis ça, je dis rien hein ? :mrgreen:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 451 Messages

24 sept. 2008, 19:39

Merci Cyrano une erreur con lol voilà c'est corrigé.

Eléphant du PHP | 217 Messages

26 sept. 2008, 07:35

Salut,
je rajouterai également que la tomate est un fruit, il faudra donc récrire quelques choix :)

lux
Eléphant du PHP | 372 Messages

26 sept. 2008, 08:13

Salut,
je rajouterai également que la tomate est un fruit, il faudra donc récrire quelques choix :)
Oui ben à Auchan, ils l'ont mis dans "legumes" dans l'ordi de la pesé ... je me suis tapé 4 pages de fruits avant de me rendre compte qu'ils s'étaient merdé :P

Eléphant du PHP | 451 Messages

26 sept. 2008, 13:07

C'est vrai que dans la réalité la tomate est un fruit mais pour tout le monde c'est un légume et la preuve comme dis lux dans les magasins elles sont rangées avec les légumes et pas les fruits donc si on part de ce principe il faut attaquer les magasins pour mauvais rangement lol

Eléphanteau du PHP | 17 Messages

26 sept. 2008, 16:35

D'un côté la tomate a beaucoup plus l'apparence d'un légume qu'une voiture...

Eléphant du PHP | 451 Messages

26 sept. 2008, 16:56

Ça c'est sûr

ViPHP
ViPHP | 5924 Messages

26 sept. 2008, 17:27

D'un côté la tomate a beaucoup plus l'apparence d'un légume qu'une voiture...
Intervention très utile au demeurant…

lux
Eléphant du PHP | 372 Messages

26 sept. 2008, 18:23

Sinon, pour recentrer.

La classe génère le html ... pour faire un truc encore plus générique, il aurait fallu séparer php et html. Au pire faire une 2e classe (ou classe fille, je sais pas), qui s'occupe de l'affichage ?

Non ? (j'y connais rien en Poo, j'essaye d'apprendre :P )

Eléphant du PHP | 451 Messages

26 sept. 2008, 18:42

Ben non pas besoin de séparer le html du php car là le html est très très peu présent dans la classe donc je pense que cela sert à rien.

ViPHP
AB
ViPHP | 5818 Messages

28 sept. 2008, 06:27

... la façon de coder n'est pas top concernant la gestion des questions réponses : un tableau pour les questions, un autre pour les réponses. Moyennement pratique pour ceux qui voudraient faire leur propre questionnaire. C'est à mon avis ce point qu'il conviendrait d'améliorer pour rendre cette classe plus pratique.

Eléphant du PHP | 451 Messages

28 sept. 2008, 10:37

Tu coderais les questions réponses comment?