Captcha ajax anti-bot

Soyez le premier à donner votre avis sur cette source.

Vue 7 405 fois - Téléchargée 945 fois

Description

Bonjour,
Je vous présente ce captcha, légèrement innovant par son principe.
A la base le principe provient de http://www.webdesignbeach.com/beachbar/ajax-fancy-captcha-jquery-plugin mais il a été redéveloppé entierement ( afin d'avoir une plus grande de sécurité et plus de fonctionnalités) sur http://jesurveille.fr/anti-bot/

Source / Exemple :


<?php
class Captcha{
	
	var $captachDir;
	var $picto;
	var $text;
	var $validate;
	
	function Captcha(){
		$this->captachDir="/captcha";
		$this->picto=array("stylo", "ciseau", "horloge", "coeur", "musique", "livre", "facebook", "chien", "maison");
		$this->text[0]="Glissez l'icone correspondante dans le cercle.<span>";
		$this->text[1]="</span>";
		$this->validate=false;
	}
	
	function genText(){
		$i=0;
		$images_captcha_html="";
		$images_captcha_in=array();
		while ($i!=5){
			$rand = rand(0,sizeof($this->picto)-1);
			if(!in_array($rand,$images_captcha_in)){
				$_SESSION['captcha-'.$i]=rand();
				$rand_item = rand(0,10000);
				$_SESSION['item-'.$rand_item]=$this->picto[$rand];
				$images_captcha_html.="<li class='captcha-". $i ."' id='captcha-". $i ."' >
										<img id='" . $_SESSION['captcha-'.$i] . "' src='" . $this->captachDir . "/item.php?img=" . $rand_item . "' alt='captcha pitco' />
									</li>";
				$images_captcha_in[]=$rand;
				$i++;
			}
		}
		$rand = rand(0,4);
		$_SESSION['captcha'] = $rand;
		$_SESSION['PictoText'] = $this->picto[$images_captcha_in[$rand]];
		unset($_SESSION['key_picto']);//
		return "<div id='captcha-content'>
					<div id='captcha-left'>
						<p id='captcha-text'>" . $this->text[0] ."<img src='".$this->captachDir."/image.php?l=".rand()."' >". $this->text[1] . "</p>
						<ul id='captcha-task'> " . $images_captcha_html . " </ul>
					</div>
					<div id='captcha-right-content'>
						<p id='captcha-right'></p>
					</div>
					<div id='captcha-reload'>
						<img src='".$this->captachDir."/imgs/refresh.png' id='captcha-reload-img'>
					</div>
					<div id='captcha-bottom'><a href='http://www.jesurveille.fr'>Je Surveille</a> - AntiBot</div>
				</div>";
	}

	function genKeyPicto(){
		$key_picto=rand(0,9000); 
		$_SESSION['key_picto']=$key_picto;
		return $key_picto;
	}
	
	
	function validate($post){
		if(isset($_SESSION['captcha']) && isset($_SESSION['captcha-'. $_SESSION['captcha']]) && isset($_SESSION['captcha2']) 
			&&isset($post['captcha']) && $post['captcha']== $_SESSION['captcha-'. $_SESSION['captcha']] 
			&& isset($post['coucou']) && $post['coucou'] == $_SESSION['captcha2'] 
			&& isset($post['coucou2']) && $post['coucou2']==true){
				$this->validate=true;
		}
		if(isset($_SESSION['captcha']) && isset($_SESSION['captcha-'. $_SESSION['captcha']])) unset($_SESSION['captcha-'. $_SESSION['captcha']]);
		if(isset($_SESSION['captcha'])) unset($_SESSION['captcha']);
		if(isset($_SESSION['captcha2'])) unset($_SESSION['captcha2']);
		return $this->validate;
	}
	
	function genSecondAccess($pass){
		$rand = rand(0,400);
		if(isset($_SESSION['captcha']) && isset($_SESSION['captcha-'. $_SESSION['captcha']]) && $_SESSION['captcha-'. $_SESSION['captcha']]==$pass){
			$_SESSION['captcha2'] = $rand;
		}	
		echo $rand;
	}
	
}

?>

Conclusion :


Si vous avez un problème, vous pouvez poster un commentaire.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
122
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
5 janvier 2009

Bonjour,

Je n'ai pas testé le code donc je ne vais pas donner mon avis sur le coté utilisateur, par contre j'aurai un conseil au niveau développement.
Il ne faudrait pas utiliser le test "==" pour comparer 2 valeurs surtout si l'une d'elle provient de l'utilisateur (variable $_POST).
En effet le test "==" compare 2 valeurs après avoir essayé de les "transtyper" pour avoir les 2 valeurs dans le même type.
Cela génère parfois des résultats surprenants.
exemple :
<?php
if ('une chaine' == 0){
echo "une chaine est équivalente à 0";
}
?>
Cela affichera "une chaine est équivalente à 0".
Pour effectuer un vrai test il faut utiliser l'opérateur de comparaison "===" qui impose une égalité au niveau des valeurs, mais aussi au niveau du type des données (sans transtypage).
Je n'ai pas testé si c'est exploitable dans le code ici, mais pour lever tous les doutes, il faudrait prendre l'habitude de toujours écrire "===" pour les tests.
Les tests doivent être plus rigoureux, mais cela va dans le sens de la sécurité.

Bonne continuation.

EM.
Messages postés
9
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
10 avril 2012

Voila Citt, les problèmes sont corrigés.

N'hésitez pas à me prévenir si il y a un soucis.
Messages postés
9
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
10 avril 2012

concernant l'image "/captcha/imgs/item-livre.png" je pense qu'une solution serait de faire '"/captcha/imgs/item.php?img=".rand() ' avec le rand en session ' $_SESSION['item-".$rand."]="livre" ' . Je le met en ligne des que j'ai un peu de temps. d'un autre coté un OCR sur l'image ca touche tous les captcha actuels...

et le mec qui suit l'installe a part avoir des logs,je vois pas ce qui fonctionne pas. J'avoue que s'est pas terrible, j'ai un peu zappé le isset.
Messages postés
213
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
2
Je veut dire que lorsqu'il y a marqué LIVRE dans l'image GD, le nom d l'image de la vignette se nomme "/captcha/imgs/item-livre.png" donc le robot fera facilement son choix (OCR sur l'image GD pour récupéré le texte, puis recup de l'id de l'image qui comprend ce nom).

Concernant les erreurs, c'est juste que tu propose une source à installer avec des erreurs, perso je suis dev donc je sais à quoi cela correspond mais le mec qui suit juste ton installation ça marche pas.

La mise en place de commentaire serait comme même un plus pour ceux qui veulent personnalisé l'image GD !

Le "display:none" sur ta checkbox ne trompe plus beaucoup de robot, un indent en négatif ou autre chose serait mieux !
Messages postés
9
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
10 avril 2012

c'est pas possible que ca passe si tu desactives le js vue que les sessions sont pas déclarées : "if($_POST['captcha'] == $_SESSION['captcha-..." regarde la fonction validate().

pour les erreurs il faut simplement rajouter if( isset($...) ) aux lignes que tu as citées.

Les vignettes ont un nom et ce nom et celui de l'image générée, c'est ça que tu veux dire?

je vais corriger tout ça dans la prochaine version ^^
Afficher les 13 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.