Steve TENZA
Intervient pour votre site internet
Facebook Me contacter Cookie
Télécharger
Noter:
4/5 (4)
Ajouté/Modifié le 2023-11-02
Visionné 3831 fois

Captcha calcul math, image PHP

Description



Voici un système de captcha basé sur des calculs mathématiques, généré sous forme d'image avec PHP. L'utilisateur doit résoudre le calcul affiché, par exemple, '[case manquante] - 10 = 5' (la réponse est 15). La réponse et l'affichage des calculs peuvent être alphabétique ou numérique.

Vous pouvez personnaliser les polices d'écriture en les plaçant dans le dossier 'fonts/'.

Ce système de captcha offre une méthode de validation simple et efficace pour protéger vos formulaires contre les robots et garantir que les utilisateurs humains soumettent les données.

Son utilisation est simplifiée en 5 étapes :

ÉTAPE 1 : Ouvrez une session avec session_start(); (au tout début de la page) pour éviter les erreurs de header.
ÉTAPE 2 : Incluez le style CSS.
ÉTAPE 3 : Incluez la fonction PHP C2captcha(). Vous pouvez envisager d'inclure cette fonction avec include en PHP pour éviter de la copier à chaque fois sur les pages où vous en avez besoin.
ÉTAPE 4 : Validez le captcha entré par l'utilisateur.
ÉTAPE 5 : Intégrez le captcha dans votre formulaire en utilisant C2captcha('[chemin vers image1.php et image2.php]'). Vous pouvez spécifier un chemin vers les images de code captcha en indiquant 'dossier_des_images_code'. Le script recherchera les images 'image1' et 'image2' dans le dossier indiqué.


//ÉTAPE 1: Important, ouvrir une session avec session_start(); (tout en haut de la page sinon vous aurez une erreur de header)
session_start();
/*ÉTAPE 2: ensuite, inclure le style CSS:*/
.C2captcha{padding:10px;display:inline-block;border:3px double red;text-align:center}
.C2captcha:hover{border-style:solid}
.C2captcha_inputs{display:inline-block;height:40px;margin-top:10px}
.C2captcha_inputs img{margin:0;height:100%;max-height:calc(100% - 2px);border:1px solid gray!important}
.C2captcha_inputs input{width:60px;display:inline;margin:0;vertical-align:top;height:calc(100% - 2px);padding:0;border:0px;border-bottom:2px dashed gray}
//ÉTAPE 3: inclure la fonction PHP C2captcha()

/*Nom: C2captcha

Vous pouvez envisager d'inclure la fonction avec include PHP pour éviter à chaque fois de coller la fonction sur les page où vous en avez besoin

Description:

Captcha calcul, l'utilisateur doit trouver la case manquante du calcul (résoudre un calcul mathématique), ex: "10 - [case manquante] = 2" (réponse 8)
Les calculs peuvent être écrits en lettres et/ou en chiffres et les réponses peuvent être demandées en lettre ou en chiffre, ex: "[ ] - treize = -3" (réponse "dix" ou "10" suivant la demande du script)

Vous pouvez mettre des polices d’écritures (fonts) différentes dans le dossier fonts/ (prenez soin de choisir des polices avec une taille à peu près pareil sinon les lettres risque d'être plus grosse ou plus petites suivant la police utilisée et le captcha illisible)

*/
function C2captcha($cheminImg=''){

//PARAMÉTREZ CI-DESSOUS:
$difficulte=2;//(1, 2 ou 3) 3 prend toutes les valeurs du tableau $chiffres, donc des calculs parfois compliqués, 1 coupe le tableau jusqu'à 5 et 2 jusqu'à 10
$signes=3;//1 = + seulement, 2 = + -, 3 = + - /, 4 = + - / *
$resultatEntier=1;//0 = résultats à virgule possibles, 1 résultat de type entier seulement
$enLettres=1;//0 = les calculs sont écrits en chiffres seulement, 1 = les calculs peuvent être écrits en lettres ou en chiffres

//en cas de demande de vérification du champ du formulaire:
if(is_int($cheminImg)){
if(!preg_match("#^([a-z]+-?[a-z]+|-?[0-9]+)$#i",$_POST['C2code'])) return false;
if($_POST['C2code']!=$_SESSION['C2captcha']['decouvrir']) return false;
return true;

//sinon on affiche le captcha
} else {
//fonction:
$chiffres=[
1=>[1,'un'],//aléatoirement une version chiffre ou une version lettre sera choisie
2=>[2,'deux'],
3=>[3,'trois'],
4=>[4,'quatre'],
5=>[5,'cinq'],
6=>[6,'six'],
7=>[7,'sept'],
8=>[8,'huit'],
9=>[9,'neuf'],
10=>[10,'dix'],
11=>[11,'onze'],
12=>[12,'douze'],
13=>[13,'treize'],
14=>[14,'quatorze'],
15=>[15,'quinze'],
16=>[16,'seize'],
17=>[17,'dix-sept'],
18=>[18,'dix-huit'],
19=>[19,'dix-neuf'],
20=>[20,'vingt'],
];
if($difficulte==1) $chiffres=array_slice($chiffres,0,5,true);
if($difficulte==1) $chiffres=array_slice($chiffres,0,10,true);
$operateurs=[
1=>['+','plus'],//aléatoirement une version symbole ou une version lettre sera choisie
2=>['-','moins'],
3=>['/','diviser'],
4=>['*','multiplier'],
];
$operateurs=array_slice($operateurs,0,$signes,true);

//on va vérifier si le résultat est un entier pour pas compliquer la tâche à l'utilisateur avec des résultats comme 1.25, 0.875,...
//si c'est pas un entier on refait un calcul (avec do while) jusqu'à arriver à un entier pour un résultat plus simple à résoudre
do{
$chiffre1=array_rand($chiffres,1);
$operateur=array_rand($operateurs,1);
$chiffre2=array_rand($chiffres,1);
if($operateur==1){
$resultat=$chiffre1+$chiffre2;
}elseif($operateur==2){
$resultat=$chiffre1-$chiffre2;
}elseif($operateur==3){
$resultat=$chiffre1/$chiffre2;
}elseif($operateur==4){
$resultat=$chiffre1*$chiffre2;
}
$chiffre1=$chiffres[$chiffre1][rand(0,$enLettres)];
$operateur=$operateurs[$operateur][rand(0,$enLettres)];
$chiffre2=$chiffres[$chiffre2][rand(0,$enLettres)];
} while(!is_int($resultat) AND $resultatEntier==1);

$valeurs=['chiffre1','chiffre2','resultat'];
$valeurCachee=array_rand($valeurs,1);
$valeurCachee=$valeurs[$valeurCachee];
$_SESSION['C2captcha']=[];
//on retourne nos valeurs
if($valeurCachee=='chiffre1'){
$calcul1=$operateur." ".$chiffre2." = ".$resultat;
//on envoi le calcul dans la page image1.php en session pour le retrouver, avec session_start()
$_SESSION['C2captcha']['calcul1']=$calcul1;
$inputs='<input name="C2code" type="text" autocomplete="off" required><img src="'.$cheminImg.'/image1.php?'.rand(0,100000).'" alt="image1 code incorrecte">';
$decouvrir=$chiffre1;
} elseif($valeurCachee=='chiffre2'){
$calcul1=$chiffre1." ".$operateur." ";
$_SESSION['C2captcha']['calcul1']=$calcul1;
$calcul2=" = ".$resultat;
$_SESSION['C2captcha']['calcul2']=$calcul2;
$inputs='<img src="'.$cheminImg.'/image1.php?'.rand(0,100000).'" alt="image1 code incorrecte"><input name="C2code" type="text" autocomplete="off" required><img src="'.$cheminImg.'/image2.php?'.rand(0,100000).'" alt="image2 code incorrecte">';
$decouvrir=$chiffre2;
} else {
$calcul1=$chiffre1." ".$operateur." ".$chiffre2." = ";
$_SESSION['C2captcha']['calcul1']=$calcul1;
$inputs='<img src="'.$cheminImg.'/image1.php?'.rand(0,100000).'" alt="image1 code incorrecte"><input name="C2code" type="text" autocomplete="off" required>';
$decouvrir=$resultat;
}
//on retourne le captcha
echo '<div class="C2captcha">';
//au cas où le chemin indiqué dans captcha(ici) est pas joignable, on affiche une erreur:
if(!file_exists(($cheminImg==''?'.':$cheminImg).'/image1.php')){//($cheminImg==''?'.':$cheminImg) = si chemin indiqué est vide, on met un . pour chercher depuis la page courante: ./
echo "Le chemin indiqué dans la fonction C2captcha est injoignable.";
} else {
//on sauvegarde le résultat à découvrir pour l'analyser lors du clic formulaire
$_SESSION['C2captcha']['decouvrir']=$decouvrir;
echo '<b>Calcul de sécurité</b><br/>Ecrivez la case manquante en <u>'.(is_numeric($decouvrir)?'chiffre':'lettre').'</u>:<br/><div class="C2captcha_inputs">'.$inputs.'</div>';
}
echo '</div><br/>';
}
}
//ÉTAPE 4: validation du captcha entré par l'utilisateur:

if(isset($_POST['C2code'])){
if(!C2captcha(1)){
echo "<p>Le code est incorrect</p>";
} else {
echo "<p>Le code est correct</p>";
}
}
//ÉTAPE 5: mise en place du captcha dans le formulaire: C2captcha('[chemin vers image1.php et image2.php]')
//utilisation en indiquant un chemin vers le images codes:
//captcha('dossier_des_images_code');//cherchera les image1 et image2 dans le dossier indiqué (ici [dossier_des_images_code], sans slash de fin)

?><br/>
<form method="post">
<?=C2captcha('images/captchacalcul')?>
<input type="submit">
</form>

Le téléchargement du captcha est possible ici :

C2captcha.zip
(Téléchargé 384 fois)





J'espère que ce script gratuit vous est utile.
Pour soutenir mon travail, un simple don ou mettre une note est grandement apprécié.
Votre réussite en ligne commence ici

Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.

Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.

Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :

Demander un devis
Réponse rapide !

Vous recherchez un script précis ?

Dites-moi ce dont vous avez besoin, je peux développer le script demandé et vous envoyer un mail dès qu'il est dispo !

🔔 Vous pouvez laisser votre mail pour recevoir les nouveaux scripts. Pas de pub, pas de tracas. Vous êtes libre de le supprimer à tout moment.

Je prends en compte toutes les demandes. Les idées les plus populaires passent en priorité et seront publiées dès qu'elles seront prêtes. 3254 demandes reçues.

Si vous avez un projet en tête, je vous suggère de me contacter directement pour en discuter.

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha
memo1memo2
Commenter

Axellle1 le 30 Juillet 2020 à 15:44

Bonjour ton captcha PHP a l'air vraiment super. Malheureusement il n'a pas l'air de fonctionner sur mon serveur. Rien qu'en mettant le répertoire complet et en exécutant exemple.PHP. Aucune image n'est généré et quand j'essaie moi-même de rentrer dans le script j'ai une erreur 500. Peut-être que ma version de PHP n'est pas prise en charge par ton script ?

admin le 30 Juillet 2020 à 16:08

Merci, as tu regardé la console du navigateur pour voir si tu avais des erreurs ?

axellle1 le 30 Juillet 2020 à 19:05

Merci de m'avoirs répondu^^

Oui voici l'erreur afficher

GET https://monlien/C2captcha/images/captchacalcul/image1.php?96498 500 (Internal Server Error)


Le blem viens de php mais aucun idée pourquoi

admin le 30 Juillet 2020 à 21:18

L'erreur 500 (Internal Server Error)

vient parfois du fichier htaccess, regardez du côté de la configuration de votre serveur si il accepte l'affichage d'image dans un dossier sans un fichier index, je vois pas d'autre solution pour l'instant

Ou mettez un fichier htaccess dans le dossier calculcaptcha, avec "Options +Indexes"

Axellle1 le 01 Août 2020 à 15:05

Oui c'est très étrange car sur wamp ça fonctionne très bien. Mais sur mon wamp j'ai toujours cet erreur 500 ...

Axellle1 le 01 Août 2020 à 15:05

Oui c'est très étrange car sur wamp ça fonctionne très bien. Mais sur mon wamp j'ai toujours cet erreur 500 ...

Axellle1 le 01 Août 2020 à 15:15

Pardon pour le doublon^^. Je voulais dire ça fonction bien sur wamp mais pas sur mon serveur lamp!! Je n'est pas mis de fichier htaccess sur mon serveur.Pour la config serveur je c'est pas ou je voir cela?

admin le 01 Août 2020 à 21:54

Je ne connais pas LAMP je ne pourrais pas vous aider, voire sur http://doc.ubuntu-fr.org/lamp peut être.

Bache le 18 Août 2023 à 19:03

Bonjour,
Je ne comprends pas comment intégrer le capcha à votre formulaire de contact
Bien cordialement

Firas Bouacida le 11 Juin 2024 à 16:39

Je viens de tester votre module captcha mais malheureusement php ne génère pas les images sous image1.php et image2.php il reçoit bien les variables de session mais pas d'images généré

Steve le 11 Juin 2024 à 16:50

Merci pour l'info, si vous voulez savoir d'où vient l'erreur, enlevez temporairement le "header(content image)" dans les fichiers image et l'erreur PHP s'affichera.

Quelle version de PHP vous avez ?

Retour à la liste des scripts

Un site à créer ?
Contactez-moi