Un petit captcha en php
Par jp.fox le mercredi 24 octobre 2007, 10:28
PHP
::
Lien permanent
Je ne trouvais pas mon bonheur sur le net (je n'ai peut être pas assez cherché) alors j'ai écrit un petit filtre antispam pour les formulaires en PHP. Il est facile à mettre en oeuvre et ne nécessite pas l'installation de police TrueType sur le serveur.
Vous pouvez faire un test ici
Pour ceux qui sont intéressés, voici le code source ainsi qu'un petit exemple l'utilisant.
ptitcaptcha.php
<?php /** * Ptitcaptcha : simple php captcha system * * @author Jean-Pierre Morfin * @license Creative Commons By * @license http://creativecommons.org/licenses/by/2.0/fr/ */ /* Change it to have a specific encoding ! */ define("PTITCAPTCHA_ENTROPY","what-ever-you-want"); /* Choose length (max 32) */ define("PTITCAPTCHA_LENGTH",5); $GLOBALS["ptitcaptcha_akey"] = md5(uniqid(rand(), true)); /** * Helper to generate html form tags * */ class PtitCaptchaHelper { /** * Generate IMG Tag * * @param string $baseuri : relative or absolute path to folder containing this file on web * @return IMG Tag */ function generateImgTags($baseuri) { return "<a href=\"#\"><img alt=\"???\" title=\"?\"". " src=\"".$baseuri."ptitcaptcha.php?pck=".$GLOBALS['ptitcaptcha_akey']."\"". " id=\"ptitcaptcha\"". " onclick=\"javascript:this.src='".$baseuri."ptitcaptcha.php?pck=". $GLOBALS['ptitcaptcha_akey']. "&z='+Math.random();return false;\" /></a>\n"; } /** * Generate hidden tag (must be in a form) * * @return input hidden tag */ function generateHiddenTags() { return "<input type=\"hidden\" name=\"ptitcaptcha_key\" value=\"".$GLOBALS['ptitcaptcha_akey']."\"/>"; } /** * Generate input tag (must be in a form) * * @return input tag */ function generateInputTags() { return "<input type=\"text\" name=\"ptitcaptcha_entry\" value=\"\"/>"; } /** * Check if user input is correct * * @return boolean (true=correct, false=incorrect) */ function checkCaptcha() { if( isset($_POST['ptitcaptcha_entry']) && $_POST['ptitcaptcha_entry'] == PtitCaptchaHelper::_getDisplayText($_POST['ptitcaptcha_key'])) { return true; } return false; } /** * Internal function * * @param string $pck * @return string */ function _getDisplayText($pck) // internal function { $src=md5(PTITCAPTCHA_ENTROPY.$pck); $txt=""; for($i=0;$i<PTITCAPTCHA_LENGTH;$i++) $txt.=substr($src,$i*32/PTITCAPTCHA_LENGTH,1); return $txt; } } // If script called directly : generate image if(basename($_SERVER["SCRIPT_NAME"])=="ptitcaptcha.php" && isset($_GET["pck"])) { $width = PTITCAPTCHA_LENGTH*10+10; $height = 30; $image = imagecreatetruecolor($width, $height); $bgCol = imagecolorallocate($image, rand(128,255), rand(128,255), rand(128,255)); imagefilledrectangle($image,0,0,$width,$height,$bgCol); $txt = PtitCaptchaHelper::_getDisplayText($_GET["pck"]); for($c=0;$c<PTITCAPTCHA_LENGTH*2;$c++) { $bgCol = imagecolorallocate($image, rand(100,255), rand(100,255), rand(100,255)); $x=rand(0,$width); $y=rand(0,$height); $w=rand(5,$width/2); $h=rand(5,$height/2); imagefilledrectangle($image,$x,$y,$x+$w,$y+$h,$bgCol); imagecolordeallocate($image,$bgCol); } for($c=0;$c<PTITCAPTCHA_LENGTH;$c++) { $txtCol = imagecolorallocate($image, rand(0,128) , rand(0,128), rand(0,128)); imagestring($image,5,5+10*$c,rand(0,10),substr($txt,$c,1),$txtCol); imagecolordeallocate($image,$txtCol); } header("Content-type: image/png"); imagepng($image); imagedestroy($image); }
test.php
<?php require("ptitcaptcha.php"); ?> <html> <head><title>PtitCaptcha</title></head> <body> <form action="test.php" method="post"> <?=PtitCaptchaHelper::generateImgTags("./")?> <?=PtitCaptchaHelper::generateHiddenTags()?> <?=PtitCaptchaHelper::generateInputTags()?> <input type="submit" /> </form> <?php if(PtitCaptchaHelper::checkCaptcha()) echo "Good"; else echo "Bad"; ?> </body> </html>




Quel talent JP.Fox, j'y capte pas grand chose à la syntaxe php, faudra que tu me donnes des cours ^^. En tout cas, léger et efficace, je le garde sous le coude, merci.
Un grand merci pour cette classe très bien réalisée.
PA
Merci PA
A peine découverte et déjà intégrée ici : www.crealp.ch/index.php?o...
et j'ai posté l'info pour les dév Joomla!
forum.joomlafacile.com/sh...
Bonne journée
PA
Magnifique
merci !!!
Cool ! content que cela puisse servir
Merci pour ce petit script, efficace et facilement modifiable !
Superbe réalisation mais voila il faut toujours quelqu'un pour critiquer et voici ma critique. Ce captcha n'est pas recommandé par tous les malvoyants déjà visuellement et surtout parceque leur système d'aide ne permettent pas de passer ou de leur donner une indication. Bref le captcha qui est en place sur le blog lui est plus respectueux des handicapées.
Merci Francis pour cette remarque.
Je vais étudier la question et essayer de trouver une solution simple.
Bonjour,
je pense modifier cette classe pour qu'elle soit accessible.
Exemple :
Recopier "deux" dans le champ ci-dessous
Avec un contrôle du côté serveur soit pour "deux" soit pour "2"
Excellent script, simple et fonctionnel. Je l'ai adapté à ma nouvelle zone membres (je ne peux pas encore donner l'adresse elle n'est pas finalisée) en ajoutant une fonctionnalité ajax qui indique en temps réel si le code saisi ne correspond pas à l'image! Ainsi, pas de mauvaise surprise à la validation pour 95% des internautes
Bonne continuation!
Excellent script, simple et fonctionnel. Je l'ai adapté à ma nouvelle zone membres (je ne peux pas encore donner l'adresse elle n'est pas finalisée) en ajoutant une fonctionnalité ajax qui indique en temps réel si le code saisi ne correspond pas à l'image! Ainsi, pas de mauvaise surprise à la validation pour 95% des internautes
Bonne continuation!
[...]
fichier : 473da.png reponse : 473da.png
fichier : 7f87f.png reponse : 7f87f.png
fichier : f82e2.png reponse : f82e2.png
images cassees : 95 soit 95.0%
max@debian:~/prog/projets/projets_finis/php/captcha/casse_images/mobilisoft$
voila, c'etait juste pour te dire que ton captcha etait vraiment mauvais... il n'a aucune deformation, et seulement 16 choix... j'arrive a 95% en seulement une demie heure, avec un code a peu pres generique...
Merci pour cette information. Je n'avais pas la prétention de faire un code inviolable mais plutôt un code facilement réutilisable avec sources disponibles pour tous. Je l'utilise sur un autre site qui était extrêmement spamé et depuis je n'ai plus de soucis...
c'est que tu etais attaque par un bot non cible qui cherchait seulement a spammer et pas a flooder
Merci pour ce petit script !
il est en ttou cas efficace pour eviter le spam de la boite mail de mon assoc !
merci tout plein !
bonjour
j'ai un p'ti souci
je ne sais pas ou indiquer l'adresse mail pour envoyer mon formulaire une fois le captcha valider.
j'aurais besoin d'un p'tit coup d'main
d'avance merci
hello
beau pti code. bravo et merci.
Mais finalement, contre le spam, pourquoi faire un captcha ?
==>> En utilisant un js simple (concat de string découpée), on recompose l'adresse mail et voila, plus de spam ! ?
Ca ne suffit pas ???
Monmail.AT. monmail_NOSPAM POINT COM
(remplacez .AT. par @ et POINT par .)
efzegfegr
gerger
Un grand merci ! Très fort le code ! Je l'utilise sur mon site nfoviewer.tk !
Bonjour,
je ne suis qu'un novice, et j'essaye d'intégrer votre code pour en finir avec les spam.
Mon problème est que le formulaire part, que le code soit renseigné ou pas. CCL, j'ai eu 65 mails dans la nuit (...)
Quelqu'un peut-il m'aider ?
Merci d'avance
Il existe une solution plus simple à mettre en oeuvre :
blog.mobilisoft.com/?2008...
bon courage avec ce satané spam !
Merci!
Superbe ! MERCI !
Merci, je pense l'utiliser sur mon site car je reçois un grand nombre de spams dans mes forumlaires.
A+
Jacky
merci super votre script ^^
Rien à dire ! Excellent script, simple d'utilisation et efficace.
Merci
Gemini
test
Tres bien
très très bien fait....je ne l'ai pas encore testé mais ça m'a l'aire d'être du bon boulot. merci.
Merci , tres interessant comme script , je l'ai testé et tout marche trés bien.
http://www.tutoslinux.com
Je trouve votre création très intéressant
Merci
J'ai trouvé mon bonheur sur le net (je n'ai pas beaucoup cherché) !!!
J'ai fais un test... ça fonctionne du premier coup !
Super efficace, facile à installer.
Je l'utiliserai dans mon prochain projet.
En tous cas un grand Merci.
Bonjour,
mon problème est le même que celui de Balrog, je ne parviens pas à bloquer l'envoi du formulaire à ma page de traitement php si le code entré n'est pas correct.
Pourriez-vous m'indiquer la marche à suivre svp ?
en fait, le captcha ne bloque pas l'envoi du formulaire, mais il permet à la page qui le reçoit de pouvoir vérifier que le code entré st bien le bon.
En gros, dans la page qui reçoit les valeurs du formulaire, il faut vérifier le captcha avant de traiter les données :
require("ptitcaptcha.php");
if(PtitCaptchaHelper::checkCaptcha())
{
}
else
{
}
Ce code est bien à mettre dans la page recevant l'action du formulaire. Alors que le code générant l'image est à placer dans la page du formulaire elle-même.
J'espère que c'est plus clair.
Si vous ne souhaitez pas que la page du formulaire soit appelée, cette solution vous conviendra sûrement mieux :
http://www.jpfox.fr/?post/2008/06/2...
Merci beaucoup ! je vais tester ça !
Fantastique ! Merci encore et bravo !
J'arrive un peu tard, mais bon.
Juste pour dire que l'idée de ne pas utiliser de session est assez sympa. Cependant, ce code a un gros défaut : il suffit de connaitre un couple ptitcaptcha_entry / ptitcaptcha_key valide pour te spammer. Une solution aurait été d'avoir une "ENTROPY" qui dépend du membre... mais on en revient au système de session.
Ou alors, une "ENTROPY" qui dépend de la date ; ça limite la validité d'un couple dans le temps, mais ce n'est pas non plus super efficace.
Génial ! Bravo et un grand merci pour cette classe php.
Je n'arrive pas à faire fonctionner cette classe. Cela doit venir de moi vu les commentaires élogieux. Lorsque j'appelle les fonctions, rien n'est retourné si bien que le code HTML reste vide..
Excellent travail, merci beaucoup, j'utilise cette classe sur mon site et c'est nickel.
J'ai tout programmé moi-même, mais pas en POO malheureusement je ne code pas aussi bien que vous, votre code est vraiment propre.
Félicitations
Merci Sébastien ^^
Bonjour à tous ..
Merci , Bravo .... mais n'étant pas un expert du tout du php , quelqu'un peut il me donner un coup de main pour integer ce petit captcha pour conditionner l'envoi d'un formulaire à un aute php .
Je m'explique : j'ai une page html contenant un formulaire qui est passe a un php qui controle les zones du formulaire et l'envoi par mail.
Je voudrais integre le controle de ce petit captcha dans ma page de formulaire avant de l'envoyer au controle .
J'arrive a afficher le captcha sans probleme (j'ai modifie ma page html en php et integre les lignes necessaires), c'est la partie "test" que je n'arrive pas à assimiler , integrer .
L'exemple avec les echo ne m'aide pas (je repete que je ne connais pas le php) .
Comment conditionner la ligne
<input type="submit" name="envoi" id="envoi" value="Envoyer le formulaire !" /> qui envoi le formulaire si capptcha est bon ou pas ...
Merci à tous de votre aide , cela permet à un "bricoleur" de faire un site pour une assos ...
Aide toi et ...
Je n'avais pas vu l'explication de jp ...
J'ai "encapsulé" le code du fichier php qui recoit mon formulaire :
require("ptitcaptcha.php");
if(PtitCaptchaHelper::checkCaptcha())
{ mon code php
}
else
{
echo ( formule de politesse et retour page formulaire)
}
.................
Encore un grand merci aux partageurs !!
@pepeboteilla : c'était tout simple ^^
Excellent petit captcha,
je l'utilise désormais pour les commentaires de tests de matériels de mon site !
Salut jp ,
Là je me suis aidé mais je trouve pas .. juste un détail de chieur ...
L'image du code n'est pas alignée avec le bouton d'entrée du code (légèrement au dessus . Comment faire pour l'aligner ??
pepeboteilla
Dans la balise img de la fonction generateImgTags( ), on peut ajouter du style :
<img style="top:-5px"
pour remonter l'image ou
<img style="top:5px"
pour la descendre
Re JP,
merci de ton aide, mais je t'avais prévenu , le php connais pas .. encore..
Je n'y arrive pas . pourrais tu mettre le code complet de la partie generateImgTags( ) pour que je scahe ou mettre le style .. Encore merci
pepeboteilla
Bonsoir,
Je suis sous WAMP et je ne réussis pas à faire fonctionner le code : aucune image ne s'affiche.
D'avance merci pour votre aide.
@Pierre : sans doute, l'extension php_gd2 n'est pas active ?
http://www.wampserver.com/phorum/re...
Bonjour,
Merci pour ce script, je le teste en ce moment, mais j'ai un petit soucis, l'image n'est pas générée dans le formulaire, le lien sur l'image si (j'ai des points d'interrogation à la place de l'image).
Est-ce un problème de droit d'écriture du script ? comment le résoudre, je ne suis pas expert (sniff) ??
Ca doit être GD qui n'est pas actif. Voir mon commentaire précédent.
Code pas générique, pas propre pour moi, pas de php5, et surtout y manque un système pour lié l'image a l'utilisateur courant qui le réclame, pour sa tout simple une vérifications pars ip, à chaque ip une nouvelle image, une fois le code rentré, destructions de l'image.
cordialement sora.
Je ne comprends pas tes remarques Sora ??
- Cette classe fonctionne très bien en php5
- pourquoi lier l'image à l'utilisateur sachant que celle-ci change a chaque réaffichage de la page (ce qui n'est pas le cas dans le contenu de mon billet mais l'image y est juste pour montrer le résultat affiché)
- destruction de l'image ?? elle n'est stockée nul part, que veux-tu détruire ?
Salut,
Je cherchais un captcha simple à intégrer pour sécuriser le formulaire d'un client et cette classe tomber à point nommé !
Au début je pensais utiliser uniquement l'image et gérer la vérification du code par le système de sessions intégré au site mais finalement j'ai utilisé les fonctions incluses dans la classe. Bon travail !
Pour les critiques relatives au spam potentiel si on connait un couple de codes, je dirais que la plupart des spammeurs sont des robots automatiques, à mon avis ce système suffit dans 99% des cas. Au pire il suffit d'intégrer une ou deux règles spécifiques, genre le numéro de session de l'utilisateur, dans le cryptage du code pour fausser un spammeur qui se serait adapté automatiquement.
Si je devais faire une remarque, ce serait sur l'usage du $GLOBALS, qui n'est pas propre lorsqu'utilisé avec une classe à mon avis. Peut-être vaudrait-il mieux instancier la classe dans le fichier .php et inclure la recherche des paramètres dans le constructeur ?
Oui Arkee, c'est vrai qu'une variable membre de la classe serait plus jolie que la variable $GLOBALS...
Merci pour les compliments ^^
Merci !!! ça fait 12 captcha que je teste et c'est le premier qui fonctionne !!!
Merci beaucoup, je l'ai utilisé sur le site http://www.dataneo.fr pour un client qui trouvait tous les captchas que je lui avais proposés illisibles. A charge de revanche, l'ami!
@Christophe : cool, content que ça serve
Coucou !
Merci pour ce code.
Peut-on par contre re-générer le captcha ?
@Jeanne : ce n'est pas prévu mais il suffit de cliquer dessus pour obtenir une nouvelle image (avec le même code)
Bonjour,
Comment et où insérer ces codes dans un formulaire ?
Merci.
hello,
merci pour le boulot fourni, cela dit, je recontre quelques difficultés.
tout d'abord le truc de "ptitcatpch enthropy" ??? c'est quoi? qu'y a-t-il à changer?
ensuite, et bien que ma gd2 soit activée, je n'ai aucune image. meme dans le code source, meme pas de lien crée ou quoi que ce soit, c'est comme si le generateimagetag ne faisait rien :'(...
est-ce que je pourrais avoir un coup de patte svp?
merci
Merci pour ce code ! Il m'a beaucoup aidé.
Thib, si tu n'as pas d'image je pense que c'est parceque tu appelles la fonction "generateImgTags" avec un mauvais paramètre.
bon code, félicitation