Télécharger
Noter:

Ajouté le 17/05/2020
Visionné 457 fois

Captcha calcul automatique en image PHP

Description

Génère une image PHP dans laquelle il y a un calcul à résoudre sous la forme "[case manquante] - 10 = 5" (réponse: 15)

Pour télécharger le script: C2captcha.zip

Utilisation simplifiée en 5 étapes:

//É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'écritues (fonts) differentes 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>

Commentaires

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 connais pas lamp je pourrais pas vous aider, voir sur http://doc.ubuntu-fr.org/lamp peut être

Ajouter un commentaire

Pseudo/Nom *
Email *
Message *
La balise [code]Votre code...[/code] peut être utilisée

Captcha * memo1memo2

Les champs marqués d'un * sont obligatoires.

Retour à la liste des scripts

Flag Counter