begin process at 2012 02 12 04:27:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > FUNCTION CAPTCHA

FUNCTION CAPTCHA


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :image, aléatoire, contrôle, formulaire Niveau :Débutant Date de création :27/11/2007 Date de mise à jour :28/11/2007 09:53:30 Vu / téléchargé :9 762 / 576

Auteur : waterw72

Ecrire un message privé
Site perso
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette fonction permet de créer une image PNG contenant des caractères
générés de façon aléatoire.

Cela permet de vérifier qu'un formulaire est rempli par une personne et non par un robot.

Source

  • <?php
  • /**
  • * @name captcha
  • * Afficher une image avec 5 caractères généré aléatoirement.
  • *
  • * @param Numeric iNbCaract : nombre de caractère
  • * @param Array aTextColor : Code couleur(RGB) séparé par des virgules de la couleur du texte.
  • * @param Array aBgColor : Code couleur(RGB) séparé par des virgules de la couleur de fond.
  • * @param Array aBorderColor : Code couleur(RGB) séparé par des virgules de la couleur de bordure.
  • *
  • * @return Image l'image crée.
  • */
  • function captcha ($iNbCaract,$aTextColor, $aBgColor, $aBorderColor ) {
  • //vérification d'existance de la fonction
  • if ( !function_exists('imagecreatetruecolor') ){
  • return false;
  • }
  • //test des paramètres
  • if (!is_int($iNbCaract))
  • $iNbCaract = 5;
  • if ( is_array($aTextColor) && count($aTextColor)=== 3 ){ // si c'est un tableau de 3
  • for($i=0; $i<3;$i++){
  • if ( $aTextColor[$i] < 0 || $aTextColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
  • $aTextColor[$i] = 0; // on met à zéro = blanc
  • }
  • }
  • }else { // c'est pas un tableau de 3
  • $aTextColor = array(0,0,0);
  • }
  • if ( is_array($aBgColor) && count($aBgColor)=== 3 ){ // si c'est un tableau de 3
  • for($i=0; $i<3;$i++){
  • if ( $aBgColor[$i] < 0 || $aBgColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
  • $aBgColor[$i] = 255; // on met à 255 = noir
  • }
  • }
  • }else { // c'est pas un tableau de 3
  • $aBgColor = array(255,255,255);
  • }
  • if ( is_array($aBorderColor) && count($aBorderColor)=== 3 ){ // si c'est un tableau de 3
  • for($i=0; $i<3;$i++){
  • if ( $aBorderColor[$i] < 0 || $aBorderColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
  • $aBorderColor[$i] = 0; // on met à zéro = blanc
  • }
  • }
  • }else { // c'est pas un tableau de 3
  • $aBorderColor = array(0,0,0);
  • }
  • //fin test des paramètres
  • //variables
  • $iWidth = $iNbCaract * 20;
  • $iHeight = 27;
  • $iFontSize = 5; // de 1 à 5
  • $sRep = "./captcha/";
  • //fin variables
  • //chiffre
  • $aCaractere = array();
  • for ($i=0; $i<=9; $i++)
  • $aCaractere[] = $i;
  • //majuscule
  • for ($i=65; $i<=90; $i++)
  • $aCaractere[] = chr($i);
  • //minuscule
  • for ($i=97; $i<=122; $i++)
  • $aCaractere[] = chr($i);
  • //texte aléatoire
  • $sTexte = "";
  • $sTexteImg = "";
  • $iLenCaractere = sizeof($aCaractere)-1;
  • for ($cpt=0;$cpt<$iNbCaract;$cpt++) {
  • $iNum_caract=rand(0, $iLenCaractere );
  • $sTexte .= $aCaractere[$iNum_caract];
  • $sTexteImg .= $aCaractere[$iNum_caract] . " ";
  • }
  • //enregistrement du texte dans la session
  • $_SESSION['captcha'] = $sTexte;
  • //création d'une image
  • $rImage = imagecreatetruecolor ($iWidth, $iHeight);
  • //couleur du texte
  • if (count($aTextColor) === 3)
  • $cText_color = imagecolorallocate ($rImage, $aTextColor[0], $aTextColor[1], $aTextColor[2]);
  • // couleur de fond
  • if (count($aBgColor) === 3)
  • $cBg_color = imagecolorallocate ($rImage, $aBgColor[0], $aBgColor[1], $aBgColor[2]);
  • // couleur de fond
  • if (count($aBorderColor) === 3)
  • $cBorder_color = imagecolorallocate ($rImage, $aBorderColor[0], $aBorderColor[1], $aBorderColor[2]);
  • // on dessine la bordure
  • imagefilledrectangle($rImage, 0, 0, $iWidth, $iHeight,$cBorder_color);
  • imagefilledrectangle($rImage, 1, 1, $iWidth-2, $iHeight-2,$cBg_color);
  • // on écrit le texte
  • imagestring ($rImage, $iFontSize, 10, 5, $sTexteImg, $cText_color);
  • // on brouille l'image : floue
  • imagefilter($rImage, IMG_FILTER_SMOOTH, 2); //IMG_FILTER_EMBOSS, IMG_FILTER_SMOOTH
  • // Rotation
  • $rImage = imagerotate($rImage, 5, $cBg_color);
  • return imagepng($rImage);
  • imagedestroy ($rImage);
  • }
  • ?>
<?php
	/**
	* @name captcha
	* Afficher  une image avec 5 caractères généré aléatoirement.
	* 
	* @param Numeric iNbCaract : nombre de caractère
	* @param Array aTextColor : Code couleur(RGB) séparé par des virgules de la couleur du texte.
	* @param Array aBgColor : Code couleur(RGB) séparé par des virgules de la couleur de fond.
	* @param Array aBorderColor : Code couleur(RGB) séparé par des virgules de la couleur de bordure.
	*
	* @return Image l'image crée.
	*/
	
	function captcha ($iNbCaract,$aTextColor, $aBgColor, $aBorderColor ) {
		//vérification d'existance de la fonction
		if ( !function_exists('imagecreatetruecolor') ){
			return false;
		}

		//test des paramètres
		if (!is_int($iNbCaract))
			$iNbCaract = 5;
			
		
		if ( is_array($aTextColor) && count($aTextColor)=== 3 ){ // si c'est un tableau de 3 
			for($i=0; $i<3;$i++){
				if ( $aTextColor[$i] < 0 || $aTextColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
					$aTextColor[$i] = 0; // on met à zéro = blanc
				} 
			}
		}else { // c'est pas un tableau de 3
			$aTextColor = array(0,0,0);		
		}

		if ( is_array($aBgColor) && count($aBgColor)=== 3 ){ // si c'est un tableau de 3 
			for($i=0; $i<3;$i++){
				if ( $aBgColor[$i] < 0 || $aBgColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
					$aBgColor[$i] = 255; // on met à 255 = noir
				} 
			}
		}else { // c'est pas un tableau de 3
			$aBgColor = array(255,255,255);		
		}
		
		if ( is_array($aBorderColor) && count($aBorderColor)=== 3 ){ // si c'est un tableau de 3 
			for($i=0; $i<3;$i++){
				if ( $aBorderColor[$i] < 0 || $aBorderColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
					$aBorderColor[$i] = 0; // on met à zéro = blanc
				} 
			}
		}else { // c'est pas un tableau de 3
			$aBorderColor = array(0,0,0);		
		}		
		//fin test des paramètres
			
		//variables
		$iWidth = $iNbCaract * 20;
		$iHeight = 27;
		$iFontSize = 5; // de 1 à 5
		$sRep = "./captcha/";
		//fin variables
					
		//chiffre
		$aCaractere = array();
		for ($i=0; $i<=9; $i++) 
			$aCaractere[]  = $i;
		//majuscule
		for ($i=65; $i<=90; $i++) 
			$aCaractere[] = chr($i);
		//minuscule
		for ($i=97; $i<=122; $i++) 
			$aCaractere[] = chr($i);
				
		//texte aléatoire
		$sTexte = "";
		$sTexteImg = "";
		$iLenCaractere = sizeof($aCaractere)-1;
		for ($cpt=0;$cpt<$iNbCaract;$cpt++) {
			$iNum_caract=rand(0, $iLenCaractere );
			$sTexte .= $aCaractere[$iNum_caract];
			$sTexteImg .= $aCaractere[$iNum_caract] . " ";
		}
					
		//enregistrement du texte dans la session
		$_SESSION['captcha'] = $sTexte;
				
		//création d'une image
		$rImage = imagecreatetruecolor ($iWidth, $iHeight);
		
		//couleur du texte
		if (count($aTextColor) === 3)
			$cText_color = imagecolorallocate ($rImage, $aTextColor[0], $aTextColor[1], $aTextColor[2]);
				
		// couleur de fond
		if (count($aBgColor) === 3)
			$cBg_color = imagecolorallocate ($rImage, $aBgColor[0], $aBgColor[1], $aBgColor[2]);
					
		// couleur de fond
		if (count($aBorderColor) === 3)
			$cBorder_color = imagecolorallocate ($rImage, $aBorderColor[0], $aBorderColor[1], $aBorderColor[2]);
		
		// on dessine la bordure
		imagefilledrectangle($rImage, 0, 0, $iWidth, $iHeight,$cBorder_color);
		imagefilledrectangle($rImage, 1, 1, $iWidth-2, $iHeight-2,$cBg_color);
					
		// on écrit le texte
		imagestring ($rImage, $iFontSize, 10, 5,  $sTexteImg, $cText_color);
		
		// on brouille l'image : floue
		imagefilter($rImage, IMG_FILTER_SMOOTH, 2); //IMG_FILTER_EMBOSS, IMG_FILTER_SMOOTH
		
		// Rotation
		$rImage = imagerotate($rImage, 5, $cBg_color);
		
		return imagepng($rImage);
		
		imagedestroy ($rImage);
	}
	
?>


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 novembre 2007 09:53:30 :
Mise à jour en fonction des remarques de garfield90 : - Ajout d'un filtre flou sur l'image - Inclinaison de l'image - Contrôle des paramètres saisis - la fonction renvoi une image - plus de HTML dans la fonction - test de l'existance de la fonction "imagecreatetruecolor"

 Sources du même auteur

Source avec Zip Source avec une capture UNE CLASS SITEMAP POUR AFFICHER L'ARBORESCENCE DE VOTRE SITE...
CLASS E-MAIL
ENREGISTRER UNE IMAGE D'UN SITE DISTANT
Source avec Zip Source avec une capture CLASS WEBMAIL
Source avec Zip CRÉATION DE MINIATURE D'UNE IMAGE

 Sources de la même categorie

Source avec Zip Source avec une capture CAMEMBERT BD par dardelphi
Source avec une capture AMÉLIORATION : CAMEMBERT par asphator
GESTION DE COULEUR par manuche
Source avec Zip NAVIGATOR (+CSSDETECTOR) par xXVoxPopuliXx
COMMENT, AVEC GD, DESSINER UN RECTANGLE TRANSPARENT PLEIN AV... par Rainbow

 Sources en rapport avec celle ci

Source avec Zip VÉRIFICATION DE FORMULAIRE EN PHP par psonic13
TESTEUR DE REGEX par hornetbzz
CLASS DE CONTRÔLE DE FORMULAIRE par baxterio
Source avec Zip CLASSE : GÉNÉRATEUR DE MINIATURE STRICTE OPTIMISÉ par GauldoMagique
Source avec Zip Source avec une capture GÉNÉRATION ALÈATOIRE D'UNE IMAGE POUVANT SERVIR DE FOND D'ÉC... par c v

Commentaires et avis

Commentaire de lowkey le 27/11/2007 16:03:38

Source simpa.
Problème : les robots utilisant un OCR n'auront aucun mal à lire ton code. Tu devrait déformer ton texte et ajouter des 'parasites'.

Bonn continuation !

Commentaire de garfield90 le 27/11/2007 16:49:56

Salut,

tu utilises 3 fois :
if (!is_string($sTextColor) || substr_count($sTextColor, ',') != 2) {
   $sTextColor = "0,0,0"; // texte en noir
}else {
   //couleur du texte
   $aText_color = "";
   $aText_color = explode(',', $sTextColor);
}

ce qui est un probleme de conception, si tu modifie le premier, tu devras le répercuter dans les autres (source d'oubli et d'erreur)
En plus, tu ne verifie pas que les valeurs fournies sont correctes

j'aurai plutot fait :

if ( is_array($aTextColor) && coutn($aTextColor)=== 3 ){
  $aTextColor = array(0,0,0);
}else{
  for($i=0; $i<3;$i++){
    if ( $aTextColor[$i] < 0 || $aTextColor[$i] > 255 ){
       $aTextColor[$i] = 0;
    }
  }
}

comme ca tu es sur que tes valeurs sont numériques et comprises entre 0 et 255

de plus, tu devrais faire un, en début de fonction
if ( function_exists('imagecreatetruecolor') ){
   return false;
}

au lieu de
$rImage = @imagecreatetruecolor ($iWidth, $iHeight)
          or die ("Impossible de crée un flux d'image GD");

ca permet :
- eviter de faire des traitements inutiles
- utilisation du @, qui est "gourmand" en ressource


Evite aussi le die, car ca interrompt ton script et ce n'est pas forcement utile et montre un manque de professionalisme du créateur ^^

Evite de mettre du HTML dans tes codes de fonctions/classes, mais ca on te la déja dit :P

Question, tu n'as pas des problemes de place en ce qui concerne les images/fichiers  générés ?

tu devrais plutot retourne le contenu :

Comme ca, tu pourrais faire un :

<img src="captcha.php" width="50px" height="25px" />

captcha.php :
<?php
include captcha.class.php // fichier ou sont mes fonctions de création de captcha
header('Content-type: img/png'); // c'est un exemple, je le connais pas par coeur :'(
captcha::generate(5,array(0,0,0),array(255,255,255),array(0,250,125));


Ca te permet de ne pas creer de fichier pour stocker ton image, un bon petit gain de place, non :)

Commentaire de waterw72 le 28/11/2007 08:27:36

Garfield90 => ...
C'est pas mieux comme ça pour le contrôle des paramètres :
if ( is_array($aTextColor) && count($aTextColor)=== 3 ){ // si c'est un tableau de 3
for($i=0; $i<3;$i++){
if ( $aTextColor[$i] < 0 || $aTextColor[$i] > 255 ){ // si ce n'est pas compris entre 0 et 255
$aTextColor[$i] = 0; // on met à zéro
}
}
}else { // c'est pas un tableau de 3
$aTextColor = array(0,0,0);
}

Commentaire de garfield90 le 28/11/2007 09:07:24

ouaip, je devais pas etre réveiller :(

Commentaire de coucou747 le 28/11/2007 14:44:48 administrateur CS

ca se casse en une demie heure

Commentaire de waterw72 le 28/11/2007 16:02:19

coucou747 => ...
Hé bien dans ce cas, expliques-moi!
au lieu de critiquer!

Commentaire de coucou747 le 28/11/2007 16:56:04 administrateur CS


t'as rien compris a ma facon de voir les choses... je t'informe juste que si tu tentes de faire un programme qui lit ca, tu y arriveras en une demie heure... puisque t'as vu mon profil, t'as du voir ceci :
http://www.phpcs.com/codes/POURQUOI-CAPTCHA-NE-SONT-ILS-PAS-TOUS-SUR_42153.aspx

on a 8 ans d'ecart et c'est pas une raison pour m'insulter de la sorte... demander des details aurait suffit....

ton trait bleu te permet de connaitre l'inclinaison de ton texte, un bot peut aisement s'en servire pour rendre au texte son inclinaison normale...

ton flou te permet d'affiner tes lettres en virant ce qui n'est pas bien noir, pour ne garder finalement que l'essentiel, c'est une premiere facon de traiter ca, la seconde c'est le nuage de points... c'est le meme algo que ceux que j'ai casse (tu fais un nuage de points et tu compares avec des lettres connues dans un alphabet de nuages de points....)

Commentaire de waterw72 le 28/11/2007 20:24:18

Ok, J'avoue que j'ai été un peu cavalier en ton égard...
Désolé.
Pourrais-tu alors me conseillé un système "captcha" pour mon site que je pourrais faire moi-même (niveau débutant )?
Que penses-tu de ceci :
http://www.selda-prey.com/article-11997929.html

Commentaire de coucou747 le 28/11/2007 21:06:41 administrateur CS

c'est un joli regroupement de captcha, perso j'aime bien les captcha texte, et je pense sincerement qu'un texte brouille, avec au moins 50 questions differentes, ayant chacune un bon caractere d'aleatoire, avec la facon de l'afficher plus ou moins hard (cf ma source a ce sujet...) est une tres bonne facon de concevoir un captcha...

sinon, les trucs avec differentes images, c'est pas forcement une mauvaise idee, mais ca consome pas mal de ressources pour rien, et il faut enormement d'images pour que ca soit efficace (recement, je suis tombe sur un captcha qui demandait juste combien faisaient 1+1... et c'est pas rare de trouver ca sur le net...)

Commentaire de kankrelune le 02/12/2007 14:24:24

return imagepng($rImage);

imagedestroy ($rImage);

ton imagedestroy(); ne sera jamais exécuté... sinon je ne suis pas sur qu'il soit utile de faire 3 boucles pour récupérer les caractères à utiliser dans la captcha... une chaine ou un tableau prédéfini suffit d'autant plus que ça te permet de trier les caractères qui peuvent être confondu... par ex le O et le 0... .. .

Si tu veux un exemple de captcha visuelle (ou non) difficilement cassable par un bot regarde dans mes sources... .. .

@ tchaOo°

Commentaire de NEVERFORGET le 03/12/2007 09:42:09

Si mon captcha t'intéresse, fais-moi signe.
Il est pas de moi et je sais plus où je l'avais trouvé mais je t'envoie volontiers le script.
Tu peux le voir à cette adresse : http://www.souriredeboncoeur.com/form/commande.php

Commentaire de darkturkey le 03/12/2007 10:42:29

Bonjour,

je ne suis pas un expert en php, j'ai fait captcha "combien font 1 p.l.u.s. 6" avec 1 et 6 des rand(1,10), et jusqu'à aujourd'hui je pensais que c'était la même chose que les images sachant que les 2 méthodes peuvent être casser par les robots.

avez-vous des sites tutoriels pour m'expliquer pourquoi les captchas images qui sont gourmands en ressources, pas adapté au grand public(mal voyant,mal entendant...) et qui sont cassables aussi et meilleur que les captchas questions ? D'après mes recherches les 2 méthodes se valent, mais comme j'ai dit je suis pas un expert et j'aimerais avoir votre avis...

merci



Commentaire de coucou747 le 03/12/2007 16:30:42 administrateur CS

les deux methodes ne se vallent pas non... suffit de tenter de hacker l'une et l'autre pour s'en rendre compte... le captcha texte dont tu parle resiste dans les 10 minutes... un bon captcha image, perso jen e tenterais pas...

Commentaire de darkturkey le 03/12/2007 16:40:19

vu ce que t'as fait comme algorithme pour craquer les captchas images je te crois sur parole et je laisse tomber les captchas questions sur le champ :)

j'ai trouvé http://www.cryptographp.com/  quand je regarde le code (j'ai pas tout compris, j'essaye encore), tu vas le casser en 30 minutes

alors, que faire ?

Commentaire de coucou747 le 03/12/2007 21:42:06 administrateur CS

certains sont facilement cassables, d'autres non, persnellement, j'aime bien le captcha de bashfr parce-qu'il est tres difficile de differencier deux lettres

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

[FORMULAIRE] Changer bouton 'submit' en image [ par cedvoyage ] Bonjour,Comment faire pour changer le bouton "submit" d'un formulaire en le remplacant par image et qui évidemment envoie aussi les données du formula Formulaire avec envoi d'image. [ par Kaeru ] J'ai crée un formulaire avec envoi de données plus image.J'ai config pour n'eccepter qu'un t'aille maximum.J'aimmerais aussi limiter la taille en pixe Formulaire + image jointe [ par jmobylette ] Bonjour et Bonne année !Je souhaiterais qu'on m'aide pour faire la page d'envoi de formulaire avec pièce jointe. Voici le code du formulaire :&lt;form le formulaire, le fichier et l'image ... [ par PhpNono ] Bonjour ! Voilà j'ai un problème : J'ai 2 pages, 1-Dans la première je vais chercher des fichier(images en fait) ça c'est bon. je les selectionne, tou probleme d'antislash [ par ouiskie ] Bonjour,Dans un formulaire qui envoie ses données dans une bdd, je ve rentrer une adresse d'image du style c:\monrep\img.jpg . Or a chaque fois que le consulter un formulaire avec une image envoyée [ par karry ] j'ai crée un formulaire où l'on peut lire les réponses mais le champs image n'apparait pas. En effet les personnes connectées peuvent m'envoyer des ph formulaire trés complex [ par akrudy ] voila au debut je faisait un simple formulaire en mailto, avec un upload d'image ( l'image ne me parvient pas)alors j'ai décider de choisir un autre m probleme de mise à jouer avec formulaire ! A l'aide ;) [ par ff2000 ] Salut à tous,voila, je suis en train de créer une partie admin avec dreamweaver.Une de mes pages doit inserer des donnée via des zones de textes (jusq Generation d'image pour formulaire [ par zzzzzz ] Yep j'essaye de generé une image pour mon formulaire poiur evité les requetes automatisé g fé:&lt;?php header("Content-type: image/jpeg"); $nbr = r a l'aide. Question formulaire [ par dedelchipie ] bonjour,J'ai une petite question à vous poser: Je suis en train de faire une page pour ajouuter un tableau de peinture: titre , version, type et l'ima


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,599 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales