<?php
// Fichier "image.php"
//Commençons la génration de l'image captcha
//on enregistre la session, pour le code, pour la vérification du formulaire
session_start();
//on indique au header qu'il faut afficher la page en tant qu'image PNG
header('Content-Type: image/png');
//largeur de l'image
$largeur = 80;
//hauteur de l'image
$hauteur = 25;
//nombre de lignes multicolore qui seront affichées avec le code (10 est bien)
$lignes = 10;
//type de caractère du code qui sera affiché dans l'image
$caracteres = "ABCDEF123456789";
//on crée l'image 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
//fonction qui permet de retourner la valeur en RGB d'une couleur hexadécimale
function hexargb($hex){
//on retourne la valeur sous forme d'array R, G et B
return [
'r' => hexdec(substr($hex,0,2)),
'g' => hexdec(substr($hex,2,2)),
'b' => hexdec(substr($hex,4,2))
];
}
//ajoute les lignes de différentes couleurs au fond blanc pour mettre de la difficulté
for($i = 0; $i <= $lignes; $i++){
//choisi une couleur aléatoirement (str_shuffle), de 6 caractères (substr(chaine,0,6)) avec la sélection alphanumérique
$rgb = hexargb(substr(str_shuffle("ABCDEF0123456789"),0,6));
imageline(
$image,
rand(1, $largeur - 25),
rand(1, $hauteur),
rand(1, $largeur + 25),
rand(1, $hauteur),
imagecolorallocate($image, $rgb['r'], $rgb['g'], $rgb['b'])
);
}
//Création du code, récupère 4 caractère aléatoirement depuis $caracteres
$code_session = substr(str_shuffle($caracteres), 0, 4);
//on enregistre le code dans une session pour vérifier ensuite se qu'à entré le visiteur est identique dans le traitement du formulaire
$_SESSION['code'] = $code_session;
// préparation du code qui va être affiché
$code = '';
for($i = 0; $i <= strlen($code_session); $i ++){
//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)
$code .= substr($code_session, $i, 1) . ' ';
}
//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);
?>
<?phpNous utilisons la fonction Math.random() pour générer une nouvelle image en rechargeant l'image par le biais d'une autre URL, ce qui garantit une image différente à chaque rafraîchissement. Cela s'accomplit en ajoutant un paramètre au style de l'image, par exemple, 'image.php?0.9610655198268976'.
// Fichier "contact.php"
session_start();
//si captcha est envoyé et que le code existe en SESSION
if(isset($_POST['captcha'], $_SESSION['code'])){
if($_POST['captcha'] == $_SESSION['code']){
echo "<p>Code correct :)</p>";
} else {
echo "<p>Le code est incorrect :(</p>";
}
}
?>
<!-- Formulaire HTML -->
<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>
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 devislemask 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
Jpbach le 28 Août 2023 à 19:39
Bonjour
Ne fonctionne pas
Le formulaire de contact fonctionne bien
Mais pour le captcha aucune lmage ni code n'apparaît
admin le 02 Septembre 2023 à 21:23
Bonjour, il se peut que des fonction d'image ne soit pas compatible avec votre version PHP. Pour vérifier si c'est le cas, enlevez la ligne suivante pour afficher le code normalement et que les erreurs s'affichent à l'écran (si il yen a) :
header('Content-Type: image/png'); //mettez deux slash pour le commenter puis enlevez-les une fois solutionné
Voilà un article potentiellement connexe : imagettftext could not find open font
Strat le 01 Octobre 2023 à 03:55
Salut,
J'essai d'intégrer ton captcha dans ton model de formulaire d'inscription mais j'ai un problème, l'inscription ne se fait pas et aucun message d'erreur ne s'affiche. Au début j'ai essayé de suivre ton tuto, en mettant simplement le captcha tout en haut du fichier, mais la je pouvait carrément m'inscrire sans taper le code captcha, donc pas bon du tout. et maintenant j'en suis là:<?php
session_start();
(Je vire une bonne partie du code car message trop long....)
if(strlen($_POST['mail'])<7 or strlen($_POST['mail'])>50){
echo "<P class='error'>Le mail doit être d'une longueur minimum de 7 caractères et de 50 maximum.</P>";
} else {
if(isset($_POST['captcha'])){
if($_POST['captcha']==$_SESSION['code']){
echo "Code correct";
$mysqli=mysqli_connect('localhost','root','root','lcfdls_php');//'serveur','nom d'utilisateur','pass','nom de la table'
if(!$mysqli) {
echo "<P class='error'>Erreur connexion BDD</P>";
(Je vire encore une partie du code car message trop long....)
if(mysqli_query($mysqli,"INSERT INTO membres SET pseudo='$Pseudo', mdp='$Mdp', mail='$Mail'")){
echo "<P class='succes'> Inscrit avec succès! Vous pouvez vous connecter en <a href='connexion.php'>Cliquant ici</a> </P>";
$TraitementFini=true;
} else {
echo "<P class='error'>Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.</P>";
}
}
}
} else {
echo "Code invalide";
}
}
}
}
}
}
}
}
if(!isset($TraitementFini)){
}
?>
<!DOCTYPE html>
Je te passe les détails sur la partie HTML, je pense pas que se soit nécessaire.
Comme tu peu le voir j'ai intégrer le captcha juste avant la connexion au serveur, et après des recherche sur le net, j'ai pu voir que pour certains ça fonctionne très bien comme ça, Du coup je comprend pas. une idée?
admin le 01 Octobre 2023 à 14:43
<?php
session_start();
$TraitementFini=false;
//lance ta connexion au début
//'serveur','nom d'utilisateur','pass','nom de la table'
$mysqli=mysqli_connect('localhost','root','root','lcfdls_php');
if(!$mysqli)
exit("Erreur connexion BDD");
//la condition suivante est contre productive, tu risque d'interdire des mails valides qui font moins de 7 caractères, par exemple a@a.fr peut être une adresse valide et fait 6 caractères mais a moins de 7 donc incorrecte pour toi ! Vire cette condition et remplace la par une vérification, tu vérifie si elle a un bon format d'adresse mail
if($_POST['mail'] != un email valide){
// ici tu as un tuto pour valider une adresse mail en PHP : https://www.c2script.com/scripts/verifier-une-adresse-mail-en-php-s2.html echo "<p class='error'>Le mail est incorrect</p>";
//fait directement un !isset() ici au lieu d'envoyer la conditon en bas du code (je fais référence à "echo "Code invalide";"
//profites-en pour ajouter la vérification de son contenu
}elseif(!isset($_POST['captcha']) || ($_POST['captcha'] != $_SESSION['code'])){
echo "<p class='error'>Code invalide</p>";
//les verifs sont OK, au passe au "else"
}else{
//toujours dans le sens "erreur > valide", met les erreurs avant le succes (donc "if(!")
if(!mysqli_query($mysqli,"INSERT INTO membres SET pseudo='$Pseudo', mdp='$Mdp', mail='$Mail'")){
echo "<p class='error'>Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.</p>";
}else{
echo "<p class='succes'>Inscrit avec succès! Vous pouvez vous connecter en <a href='connexion.php'>Cliquant ici</a></p>";
$TraitementFini=true;
}
}
if(!isset($TraitementFini)){
//affichage du formulaire
}
?>
Strat le 02 Octobre 2023 à 23:35
Wow, merci, mais... je comprend pas pourquoi tu me dit de tout modifier alors que c'est ton code que j'ai chopé ici: https://www.c2script.com/scripts/espace-membre-php-s33.html
Il est censé être bon non?
Certes j'ai modifié quelques trucs pour adapter à mon site mais le code de base reste le même.
En soit pour faire simple, ce que je cherche à faire c'est d'insérer TON captcha dans TON formulaire. ni plus ni moins. Et si c'est pas faisable, je tenterai de faire comme dans ton précédent message, mais je sens que je vais y perdre des cheveux ^^
admin le 02 Octobre 2023 à 23:39
Ne le prends pas mal, je te donne juste des conseils. Mes connaissances sont meilleures depuis que j'ai posté ce code, qui ceci dit, est 100% fonctionnel.
C'est faisable, lis bien les tutos en question, essais de comprendre et si tu as des questions, poses les :)
Strat le 03 Octobre 2023 à 00:27
Je te rassure je ne prend rien de mal, désolé si mon message a pu te le faire croire. Je ne comprenais juste pas pourquoi tu me disait de tout modifier, mais, maintenant je comprend mieux. lol
Des tutos, des forums... je fait ça à longueur de journée, du coup je fini embrouillé comme pas possible avec en prime un mal de tête ^^
Bon je retourne sur mes lignes de code. en attendant merci pour ton aide.
Strat le 03 Octobre 2023 à 01:07
Rho pétard!!! C'est bon ça fonctionne :)
Je savais que c'était encore une erreur stupide.
Pour tester je ne c'est même plus quoi, J'avais enlevé le "name=valider" dans la partie HTML sur la ligne <input type="submit"name="valider" value="Valider">. et comme au début du code php je mentionne le "valider" comme ceci: if(isset($_POST['valider'])){
if(!isset($_POST['pseudo'],$_POST['mdp'],$_POST['mail'])){
echo "<P cUn des champs n'est pas reconnu. </P>";lass='error'>
ça ne risquait pas de fonctionner. C'est pour ça que j'avais rien qui se passait quand je cliquait sur valider. et pour le coup dans mon premier post je te dit que ça ne sert a rien que je mette la partie HTML, bah si en fait, j'suis sur que tu y aurait vu direct. lol.
Bon c'est quand même grâce à tes conseils que j'ai trouvé mon erreur, parce que j'ai refais tout mon code et c'est en arrivant à cette ligne que je me suis dit, "tiens, y manque quelque chose la" ^^
Alors encore une fois merci à toi pour tes conseils ;)
admin le 03 Octobre 2023 à 10:10
Content que tu ai réussi, n'hésites pas à poser d'autres questions.
Utilise la balise code pour tes prochains messages afin de mettre en valeur le code.