<?php
session_start();//on enregistre la session, pour le code, pour la vérification du formulaire
//le fichier se nomme: image.php
//on indique au header qu'il faut afficher le code en tant qu'image
header('Content-Type: image/png');
$largeur=80;//largeur de l'image
$hauteur=25;//hauteur de l'image
$lignes=10;//nombre de lignes multicolore qui seront affichées avec le code (10 est bien)
$caracteres="ABCDEF123456789";//type de caractère du code qui sera affiché dans l'image
//on crée le rectangle
$image = imagecreatetruecolor($largeur, $hauteur);
//on met un fond en blanc (255,255,255)
imagefilledrectangle($image, 0, 0, $largeur, $hauteur, imagecolorallocate($image, 255, 255, 255));
//on ajoute les lignes
function hexargb($hex) {//fonction qui permet de retourner la valeur en RGB d'une couleur hexadécimale
return array("r"=>hexdec(substr($hex,0,2)),"g"=>hexdec(substr($hex,2,2)),"b"=>hexdec(substr($hex,4,2)));//on retourne la valeur sous forme d'array
}
for($i=0;$i<=$lignes;$i++){
$rgb=hexargb(substr(str_shuffle("ABCDEF0123456789"),0,6));//choisi une couleur aléatoirement (str_shuffle), de 6 caractères (substr(chaine,0,6)) avec la sélection alphanumérique
imageline($image,rand(1,$largeur-25),rand(1,$hauteur),rand(1,$largeur+25),rand(1,$hauteur),imagecolorallocate($image, $rgb['r'], $rgb['g'], $rgb['b']));
}
$code1=substr(str_shuffle($caracteres),0,4);
$_SESSION['code']=$code1;//on enregistre le code dans une session pour vérifier ensuite se qu'à entré le visiteur est identique
$code="";//on initialise le code
for($i=0;$i<=strlen($code1);$i++){
$code .=substr($code1,$i,1)." ";//on rajoute des espace entre chaque lettre ou chiffre pour faire plus aéré (notez le . devant = qui permettra d'ajouter un caractère après l'autre à $code)
}
//on écrit le code dans le rectangle
imagestring($image, 5, 10, 5, $code, imagecolorallocate($image, 0, 0, 0));
//on affiche l'image
imagepng($image);
//puis on détruit l'image pour libérer de l'espace
imagedestroy($image);
?>
//page contact.php
session_start();
if(isset($_POST['captcha'])){
if($_POST['captcha']==$_SESSION['code']){
echo "Code correct";
} else {
echo "Code incorrect";
}
}
<!-- page contact.php -->
<form action="contact.php" method="post">
<input type="text" name="captcha"/>
<input type="submit"/>
<img src="image.php" onclick="this.src='image.php?' + Math.random();" alt="captcha" style="cursor:pointer;">
</form>
Math.random() en JavaScript permet d'afficher un chiffre de type flottant, de 0 à 1 (1 n'est jamais affiché vu que c'est un nombre à virgule)
lemask le 28 Janvier 2016 à 11:54
Merci pour ces informations
Gamer le 30 Avril 2017 à 14:23
J'utilise ce script dans mon site mais quand je fais if isset ....
Le $post ne marche pas.
Je n'utilise pas le header parce que ça affiche que l'image sans le input zones
P.s: le script est fait include et avant ce script j'utilise head où il y a déjà session start
admin le 01 Mai 2017 à 14:10
Quel erreur avez-vous à l'écran quand vous postez le formulaire ?
Gamer le 13 Mai 2017 à 12:55
Je n'ai pas d'erreur mais ça n'affiche pas les input et les labels, vu qu'il y a
header(type image/png)
Cordialement.
admin le 13 Mai 2017 à 15:03
Bonjour, le code du captcha est un fichier appart, il se nomme image.php, pas besoin d'include se fichier il sera appelé avec l'affichage de l'image:
...<img src="image.php" onclick="thi...
boussad le 11 Janvier 2019 à 22:04
comment je doit faire pour l’utilisation correcte de ce script et merci d'avance
admin le 12 Janvier 2019 à 10:15
Bonjour, apprendre un minimum le PHP.
TT22 le 11 Janvier 2021 à 13:30
Ce captcha n'est pas bien protégé, en effet un nouveau code est généré uniquement au chargement du fichier "image.php", donc pour garder le même code et faire des envois automatiques il suffit à l'utilisateur mal intentionné de ne pas recharger cette page, et il pourra ainsi valider le captcha à l'infini avec un seul code.
Une solution simple serait de redéfinir$_SESSION['code']à une valeur aléatoire en cas d'échec dans contact.php.
admin le 11 Janvier 2021 à 14:07
Merci pour votre commentaire.
Je peux redéfinir$_SESSION['code']en$_SESSION['code[suite de chiffres aléatoires]']comme:$_SESSION['code2154578']?
le fait de créer plusieurs session avec des nom différents, m’encombre pas le dossier de session (sess tmp) ?
TT22 le 11 Janvier 2021 à 14:16
Le mieux serait carrément de faire :
//page contact.php
session_start();
if (isset($_POST['captcha'])) {
if ($_POST['captcha'] == $_SESSION['code'] && $_POST['captcha'] !== NULL) {
echo "Code correct";
} else {
echo "Code incorrect";
$_POST['captcha'] = NULL;
}
}
helpmalinois le 24 Août 2021 à 14:35
bonjour je voudrais inclure le captcha dans le formulaire que vous avez crée je ne c'est pas comment l'integré pouvez vous m'aidez