<?php
session_start();
function C2captchaList(){
//vous pouvez définir ici combien vous souhaitez avec de caractères pour chaque code
$caracteres = 4;
//vous pouvez définir ici combien vous souhaitez avoir de faux codes à choisir dans la liste déroulante
$nombre_de_codes = 5;
//j'ai enlevé le O (lettre o) et le 0 (chiffre 0) volontairement car ils peuvent prêter à confusion
$captcha = substr(str_shuffle("ABCDEFGHIJKLMNPQRSTUVWXYZ123456789"),0,$caracteres);
//pensez à bien initialiser la session avec "session_start();" tout en haut de votre page, avant n'importe quel balise HTML
$_SESSION['captcha'] = $captcha;
//initiation du tableau qui contiendra tous les faux codes à choisir dans la liste + le captcha
$liste_codes[] = $captcha;
$i = 0;
while($i < $nombre_de_codes - 1){
$liste_codes[] = substr(str_shuffle("ABCDEFGHIJKLMNPQRSTUVWXYZ123456789"),0,$caracteres);
$i ++;
}
//on mélange tous les codes pour pas que le bon code soit en premier dans la liste
shuffle($liste_codes);
return [
'liste' => $liste_codes,
'code' => $captcha
];
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Nouveau Captcha</title>
</head>
<body>
<?php
// Le formulaire est envoyé, on traite les données
if(isset($_POST['captcha'], $_SESSION['captcha'])){
// Si le captcha sélectionné n'est pas le bon
if($_POST['captcha'] != $_SESSION['captcha']){
//on stop le traitement
echo "<p>Captcha incorrect !</p>";
}else{
//on continu le traitement...
echo "<p>Captcha correct !</p>";
// Ici, vérifiez vos autres champs
// ...
}
}
// L'initialisation de $captcha doit impérativement être placée en dessous de la vérification des champs du formulaire, sinon le code sera toujours faux lors de sa vérification car il sera toujours un nouveau code
$captcha = C2captchaList();
?>
<form method="post">
<p>Ici les champs de votre formulaire...</p>
<p>Choisissez le code <?= $captcha['code'] ?> dans la liste suivante :</p>
<!-- avec onchange="this.form.submit()" on valide le formulaire dès qu'il à choisi le code! -->
<select name="captcha" onchange="this.form.submit()">
<option>Choissiez le code affiché :</option>
<?php
foreach($captcha['liste'] as $code):
echo '<option value="' . $code . '">' . $code . '</option>';
endforeach;
?>
</select>
<!-- on laisse le bouton valider au cas où le javascript ne serait pas activé sur le navigateur du visiteur -->
<input type="submit" name="valider" value="Valider">
</form>
</body>
</html>
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é.
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 devisjean-luc adant le 27 Janvier 2019 à 15:38
Super simple et en une seule page
j'ai simplement remplacer la ligne .
-
echo "Captcha correct!";
Par
echo '<h3 align="center">texte - <a href="www.monsite.be">texte du lien</a><br /></h3>';exit;
-
merci
Nouha le 16 Avril 2019 à 23:29
j'essay ce code mais j'ai un p'tit problème :(
Parse error: syntax error, unexpected 'if' (T_IF) in C:\xampp\htdocs\captcha\contact.php on line 11
comment le résoudre ?!
admin le 17 Avril 2019 à 00:28
Bonjour, il vous faut regarder à la ligne 11 si votre condition if est correcte.
Parse error: syntax error, unexpected 'if' (T_IF) in C:\xampp\htdocs\captcha\contact.php on line 11
TT22 le 11 Janvier 2021 à 13:23
Ce captcha est totalement inutile.
Vous donnez la réponse en clair, il est donc très facile de sélectionner automatiquement la bonne réponse.
Ci-dessous un exemple en Javascript qui valide le captcha automatiquement :
var code = document.body.innerHTML.match(new RegExp('code (.*) dans'))[1];
document.getElementsByTagName('select')[0].value = code;
document.getElementsByTagName('form')[0].submit();
admin le 11 Janvier 2021 à 14:01
Bonjour, merci pour votre commentaire.
Je sais, mais ça limite le post par robots car il faut cliquer sur quelque chose.
TT22 le 11 Janvier 2021 à 14:04
Non ça ne limite pas les posts par des robots, le code que j'ai envoyé le montre bien ! Il valide le formulaire sans intervention humaine.
Dan le 09 Juin 2022 à 07:59
Je modifirais la session par ceci pour améliorer et complexifier un peu pour éviter les man-and-the-middle :
<?php echo substr($_SESSION['captcha'], rand(1, 5), -rand(3, 5)); ?>
Le code ne pourra pas être automatisé.