Recherche script PHP anti-spam ou Captcha
Fermé
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
-
15 avril 2008 à 16:02
Alain - 1 oct. 2011 à 13:36
Alain - 1 oct. 2011 à 13:36
A voir également:
- Recherche script PHP anti-spam ou Captcha
- Rechercher ou entrer l'adresse - Guide
- Script vidéo youtube - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Easy php - Télécharger - Divers Web & Internet
- Captcha incorrect ✓ - Forum Réseaux sociaux
6 réponses
bg62
Messages postés
23658
Date d'inscription
samedi 22 octobre 2005
Statut
Modérateur
Dernière intervention
20 novembre 2024
2 389
30 avril 2008 à 16:53
30 avril 2008 à 16:53
un captcha tout simple et efficace :
@+
b g
<?php class capcha{ var $min; var $max; var $alphabet; var $word; var $num; var $numletter; function capcha(){ $this->min = 4; $this->max = 6; $this->alphabet = 'abcdefghijklmnopqrstuvwxyz'; $this->grain_de_sel = '6tIb90ZAS11'; $this->word = $this->createWord(); $this->num = $this->chooseNum(); $this->numletter = $this->num2letter(); } function q(){ return 'Quelle est la '.$this->numletter.' lettre du mot '.$this->word.' ?'; } function createWord(){ $len = rand($this->min,$this->max); for($i=0;$i<$len;$i++){ $word[$i] = $this->alphabet[rand(0,strlen($this->alphabet)-1)]; } return implode('',$word); } function chooseNum(){ return rand(1,strlen($this->word)); } function num2letter(){ if($this->num == strlen($this->word)){ return 'dernière'; } $array = array('1' => 'première','2' => 'deuxième','3' => 'troisième','4' => 'quatrième','5' => 'cinquième','6' => 'sizième','7' => 'septième','8' => 'huitième','9' => 'neuvième','10' => 'dixième'); if(isset($array[$this->num])){ return $array[$this->num]; }else{ return $this->num.'.ème'; } } function r(){ return md5($this->grain_de_sel.$this->word[$this->num-1]); } } ?>
@+
b g
avion-f16
Messages postés
19249
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
15 juin 2024
4 505
24 déc. 2009 à 11:53
24 déc. 2009 à 11:53
Cryptographp est très bien.
Ozimandias
Messages postés
502
Date d'inscription
jeudi 14 mai 2009
Statut
Membre
Dernière intervention
10 mars 2010
46
24 déc. 2009 à 12:06
24 déc. 2009 à 12:06
Voici le code d'un fichier anti-spam.php qui crée une image captcha:
dans ton code de formulaire tu l'appelles comme une image: <img src="anti-spam.php" />
la valeur du code captcha se trouve dans la variable de session: $_SESSION['rand_code']
le code créé est une suite de 4 lettres, il est modifiable a souhait et fonctionne avec la bibliothèque GD de création d'image.
@+
session_start(); if ((!isset($_SESSION['rand_code'])) || ($_SESSION['rand_code']=='')) { $str = ""; $length = 0; for ($i = 0; $i < 4; $i++) { // this numbers refer to numbers of the ascii table (small-caps) $str .= chr(rand(97, 122)); } $_SESSION['rand_code'] = $str; } $imgX = 100; $imgY = 40; $image = imagecreatetruecolor(100, 40); $backgr_col = imagecolorallocate($image, 238,239,239); $border_col = imagecolorallocate($image, 208,208,208); $text_col = imagecolorallocate($image, 46,60,31); $trait_col = imagecolorallocate($image, 46,60,31); imagefilledrectangle($image, 0, 0, 100, 40, $backgr_col); imagerectangle($image, 0, 0, 99, 39, $border_col); imageline($image, 0, 0, 100, 40, $trait_col); imageellipse($image, 50, 20, 75, 30, $trait_col); $font = "ARIAL.TTF"; $font_size = 15; $angle = 10; $box = imagettfbbox($font_size, $angle, $font, $_SESSION['rand_code']); $x = (int)($imgX - $box[4]) / 2; $y = (int)($imgY - $box[5]) / 2; imagettftext($image, $font_size, $angle, $x, $y, $text_col, $font, $_SESSION['rand_code']); header("Content-type: image/png"); imagepng($image); imagedestroy ($image);
dans ton code de formulaire tu l'appelles comme une image: <img src="anti-spam.php" />
la valeur du code captcha se trouve dans la variable de session: $_SESSION['rand_code']
le code créé est une suite de 4 lettres, il est modifiable a souhait et fonctionne avec la bibliothèque GD de création d'image.
@+
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Statut
Membre
Dernière intervention
6 juin 2008
15 avril 2008 à 20:16
15 avril 2008 à 20:16
Salut Stefart,
C'est tout expliqué ici :
http://www.6ma.fr/tuto/image-de-securite-pour-formulaires-php/
Je ne sais pas quel est ton niveau en PHP mais j'espère que ca pourra t'aider.
Bonne chance !
C'est tout expliqué ici :
http://www.6ma.fr/tuto/image-de-securite-pour-formulaires-php/
Je ne sais pas quel est ton niveau en PHP mais j'espère que ca pourra t'aider.
Bonne chance !
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
16 avril 2008 à 12:43
16 avril 2008 à 12:43
merci beaucoup de ta source web_traveller
mais mon problème est que j'ai deja sur mon site et surtout sur ma page un session_start(); en debut de page alors si j'utilise le variable de session du captcha
ca m'empêche donc de me loger sur si non ça détruit la première ou interdit l'accès a la page !
ou alors c'est moi qui intègre mal le code dans la page ?! :(
voila deja le code session_start() que j'utilise sur ma page :
et l'action de mon form est la suivante :
y'a une solution simple pour contourné le problème ? ou pas
j'imagine que 2 variable de session sur la même page c'est chaud a non ??!!
Déjà pour le formulaire de contact ça marche bien alors merci un bon point de resolu.
Mais si tu a des idées pour mon probleme de session je prend merci
mais mon problème est que j'ai deja sur mon site et surtout sur ma page un session_start(); en debut de page alors si j'utilise le variable de session du captcha
ca m'empêche donc de me loger sur si non ça détruit la première ou interdit l'accès a la page !
ou alors c'est moi qui intègre mal le code dans la page ?! :(
voila deja le code session_start() que j'utilise sur ma page :
<?php session_start(); //session inscription au site ----------------------- if ($HTTP_POST_VARS['inscription']=="ok") { //sélection de la base de données mysql_select_db($database_cnx_pa, $cnx_pa); //vérification si le mail existe déjà dans la base $FORMemail=trim($FORMemail); //supprime les espaces éventuels $query_rsClient = "SELECT email FROM clients WHERE email = '$FORMemail' "; $rsClient = mysql_query($query_rsClient , $cnx_pa) or die(mysql_error()); $totalRows_rsClient = mysql_num_rows($rsClient); //echo '$totalRows_rsClient='.$totalRows_rsClient; if ($totalRows_rsClient==0) { //enregistrement dans la base du nouveau compte client $insertSQL = "INSERT INTO clients (nom, email, pass) VALUES ('$nom', '$FORMemail', '$FORMpass')"; $Result1 = mysql_query($insertSQL , $cnx_pa) or die(mysql_error()); $clientID=mysql_insert_id();//récupère l'identifiant client attibué //mémorisation des paramètres dans la session $statut="client"; session_register("clientID"); session_register("statut"); header("Location:menu.php"); }//fin du if ($totalRows_rsClient==0) else { $erreur_mail=1; } }//fin du if ($HTTP_POST_VARS['inscription']=="ok") ------------------- ?>
et l'action de mon form est la suivante :
form action="<?php echo $editFormAction; ?>" method="post" name="form" id="form" onSubmit="return testform(this.nom,this.FORMemail,this.FORMpass)">
y'a une solution simple pour contourné le problème ? ou pas
j'imagine que 2 variable de session sur la même page c'est chaud a non ??!!
Déjà pour le formulaire de contact ça marche bien alors merci un bon point de resolu.
Mais si tu a des idées pour mon probleme de session je prend merci
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Statut
Membre
Dernière intervention
6 juin 2008
>
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
24 avril 2008 à 12:17
24 avril 2008 à 12:17
Salut Stefart,
Tu peux tout a fait ouvrir une session au point d'entrée de ton utilisateur. Ensuite, sur le formulaire avec la captcha, tu ne mets PAS session_start(); car la session est déjà ouverte, mais par contre tu utilises les variables de cette même session dont tu as besoin pour le formulaire captcha, par exemple $_SESSION['code']=$code;
Une session est unique pour chaque utilisateur de ton site, et donc comme tu dis en effet, on ne démarre pas plusieurs sessions par page. Par contre la session se transmet de page en page ce qui est l'avantage.
Regarde sur cette page si tu veux plus d'explications sur les sessions :
http://www.programmationworld.com/php/cours/index.php?page=cours&id_cours=8&affichage=2
J'espère que ça va marcher pour toi !
Web Traveller
Tu peux tout a fait ouvrir une session au point d'entrée de ton utilisateur. Ensuite, sur le formulaire avec la captcha, tu ne mets PAS session_start(); car la session est déjà ouverte, mais par contre tu utilises les variables de cette même session dont tu as besoin pour le formulaire captcha, par exemple $_SESSION['code']=$code;
Une session est unique pour chaque utilisateur de ton site, et donc comme tu dis en effet, on ne démarre pas plusieurs sessions par page. Par contre la session se transmet de page en page ce qui est l'avantage.
Regarde sur cette page si tu veux plus d'explications sur les sessions :
http://www.programmationworld.com/php/cours/index.php?page=cours&id_cours=8&affichage=2
J'espère que ça va marcher pour toi !
Web Traveller
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
>
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Statut
Membre
Dernière intervention
6 juin 2008
29 avril 2008 à 14:40
29 avril 2008 à 14:40
salut web_traveller
merci pour tes lumières mais j'y arrive ça marche pas !!
voici mon code source :
merci
merci pour tes lumières mais j'y arrive ça marche pas !!
voici mon code source :
<?php session_start(); //session inscription au site ----------------------- if ($HTTP_POST_VARS['inscription']=="ok") { //sélection de la base de données mysql_select_db($database_cnx_pa, $cnx_pa); //vérification si le mail existe déjà dans la base $FORMemail=trim($FORMemail); //supprime les espaces éventuels $query_rsClient = "SELECT email FROM clients WHERE email = '$FORMemail' "; $rsClient = mysql_query($query_rsClient , $cnx_pa) or die(mysql_error()); $totalRows_rsClient = mysql_num_rows($rsClient); //echo '$totalRows_rsClient='.$totalRows_rsClient; if ($totalRows_rsClient==0) { //enregistrement dans la base du nouveau compte client $insertSQL = "INSERT INTO clients (nom, email, pass) VALUES ('$nom', '$FORMemail', '$FORMpass')"; $Result1 = mysql_query($insertSQL , $cnx_pa) or die(mysql_error()); $clientID=mysql_insert_id();//récupère l'identifiant client attibué //mémorisation des paramètres dans la session $statut="client"; session_register("clientID"); session_register("statut"); header("Location:menu.php"); }//fin du if ($totalRows_rsClient==0) else { $erreur_mail=1; } }//fin du if ($HTTP_POST_VARS['inscription']=="ok") ------------------- ?>
<form action="<?php echo $editFormAction; ?>" method="post" name="form" id="form" onSubmit="MM_validateForm('nom','','R','FORMemail','','R','verif','','R','FORMpass','','R');return document.MM_returnValue"> <table width="400" border="0" align="center" cellpadding="0" cellspacing="3"> <tr> <td width="126"><div align="right"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nom</font></div></td> <td colspan="2"><input name="nom" type="text" id="nom" size="30"> **</td> </tr> <tr> <td><div align="right"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">E-Mail</font></div></td> <td colspan="2"><input name="FORMemail" type="text" id="FORMemail" size="30"> **</td> </tr> <tr> <td><div align="right">Mot de passe</div></td> <td colspan="2"><input name="FORMpass" type="password" id="FORMpass" size="10" maxlength="10"> 10car maxi**</td> </tr> <tr> <td colspan="3" align="center">Recopiez le code de vérification suivant :</td> </tr> <tr> <td> </td> <td width="96"><img src="imagesecu.php" alt="image de protection" /></td> <td width="166"><input type="text" name="verif" size="10" maxlength="6" /></td> </tr> <tr> <td colspan="3" align="center"> <input type="checkbox" name="accord" id="accord" value="OUI"><a href="mentions_legales.php]"> Accord les Conditions Générales</a></td> </tr> <tr> <td colspan="3"><div align="center"><font color="#FF0000">** Attention tous les champs sont obligatoires</font></div></td> </tr> <tr> <td><input name="inscription" type="hidden" id="inscription" value="ok"></td> <td colspan="2"><input type="submit" name="Submit" value="Envoyer"></td> </tr> </table> </form> <?php // On initialise la session Anti-spam /* on vérifie que la code est toujours mémorisé en session et qu'il fait 6 caractères */ if(!isset($_SESSION['code']) || strlen($_SESSION['code']) != 6) die("Erreur !"); // on vérifie que la code entré est valide if($_SESSION['code'] != $_POST['verif']) die("Erreur : le code de protection est invalide !"); /* Ici on traite les données du formulaire, on envoie le mail par exemple pour un formulaire de contact */ // on détruit les variables de session, désormais inutiles session_unset(); session_destroy(); ?> <input type="hidden" name="MM_insert" value="form1">
merci
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Statut
Membre
Dernière intervention
6 juin 2008
>
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
30 avril 2008 à 15:34
30 avril 2008 à 15:34
Salut Stefart !
Quel est le problème que tu rencontres exactement avec ton script ? Donne-moi des précisions autrement c'est difficile de t'aider.
Web Traveller
Quel est le problème que tu rencontres exactement avec ton script ? Donne-moi des précisions autrement c'est difficile de t'aider.
Web Traveller
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
10 juin 2008
>
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Statut
Membre
Dernière intervention
6 juin 2008
5 mai 2008 à 08:29
5 mai 2008 à 08:29
salut
mon problème est que je ne sais pas ou placer le script de Captcha dans la page pour que ça fonctionne !
Avant ! formulaire il m'indique uniquement erreur (normale j'imagine puis que le code n'a pas encore été saisi)
Apres ! avec ou sans le code l'enregistrement passe
Indication : mon formulaire d'inscription et mon script d'enregistrement est sur la même page d'où l'erreur !
merci de ton aide en tous cas
mon problème est que je ne sais pas ou placer le script de Captcha dans la page pour que ça fonctionne !
Avant ! formulaire il m'indique uniquement erreur (normale j'imagine puis que le code n'a pas encore été saisi)
Apres ! avec ou sans le code l'enregistrement passe
Indication : mon formulaire d'inscription et mon script d'enregistrement est sur la même page d'où l'erreur !
merci de ton aide en tous cas
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour
Je souhaite créer un module de commentaires sur mon site. Je m'aide de quelques scripts sur le net que j'essaye d'améliorer, ainsi que de revues (genre PHP pour débutants de Johann-Christian Hanke).
Peu à peu, je suis arrivé à quelque chose de fonctionnel, mais avant de mettre la chose en ligne, je souhaiterais y ajouter un CAPTCHA... et je bloque à ce niveau. Certes il en existe de tout faits, mais j'ai plutôt opté pour un CAPTCHA simple personnel sous forme de question aléatoire...
Le problème, c'est que si j'inclus cette question/réponse dans mon formulaire FORM, quelle que soit la réponse, ça passe et le commentaire est enregistré...
----------> Voilà mon formulaire (édulcoré) :
<form method="POST" name="formulaire" action="<? echo("$PHP_SELF"); ?>">
Nom / Pseudo : <input maxlength="25" type="text" name="pseudo" size="37" value=""><br>
eMail (Facultatif) : <input maxlength="25" type="text" name="titrems" size="37" value=""><br>
Votre commentaire : <textarea rows="9" name="commentaire" cols="37"></textarea><br>
<?php
$var1 = array('chapeau','pantalon','tableau');
$var2 = array('rouge','marron','mauve');
$var3 = array('DSK','Sarkozy','Chirac');
$couleurfinale = $var2[rand(0,3)];
$phrase = 'Quelle est la couleur du '.$var1[rand(0,3)].' '.$couleurfinale.' de '.$var3[rand(0,3)].' ?';
$couleurep = "";
?>
<? echo $phrase;?><br>
<input maxlength="25" type="text" name="couleurep" size="37">
<br><br><INPUT TYPE="submit" value="Valider" name="submit" onClick="this.value='Patientez...';">
</form>
----------> Voilà la façon dont je le traite (édulcoré) :
$valide = 0;
if (isset($couleurep)) {
echo $couleurep." + ".$couleurfinale;
if ($couleurep==$couleurfinale) {
$valide = 1;
}
}
if ($valide = 1){
$fp = fopen("commentaires/$idcom.txt","a");
fputs($fp, "$titrems|$commentaire|$pseudo|$temps");
fputs($fp,"£");
fclose($fp);
echo("<script language=\"javascript\">alert('Votre commentaire a été enregistré');</script>");
}
else
{
echo("<script language=\"javascript\">alert('Votre message ne respecte pas la charte...');</script>");
}
----------
Je ne vois pas d'ou cela peut provenir (il faut dire que mes compétences sont limitées). Je fais un teste entre les deux variables : tirage aléatoire de la couleur et couleur rentrée par le visiteur... mais cela ne fonctionne pas car même si les deux variables sont différentes, le commentaire s'enregistre...
Merci pour vos éventuels éclaircissements et désolé pour mon incompétence :)
Je souhaite créer un module de commentaires sur mon site. Je m'aide de quelques scripts sur le net que j'essaye d'améliorer, ainsi que de revues (genre PHP pour débutants de Johann-Christian Hanke).
Peu à peu, je suis arrivé à quelque chose de fonctionnel, mais avant de mettre la chose en ligne, je souhaiterais y ajouter un CAPTCHA... et je bloque à ce niveau. Certes il en existe de tout faits, mais j'ai plutôt opté pour un CAPTCHA simple personnel sous forme de question aléatoire...
Le problème, c'est que si j'inclus cette question/réponse dans mon formulaire FORM, quelle que soit la réponse, ça passe et le commentaire est enregistré...
----------> Voilà mon formulaire (édulcoré) :
<form method="POST" name="formulaire" action="<? echo("$PHP_SELF"); ?>">
Nom / Pseudo : <input maxlength="25" type="text" name="pseudo" size="37" value=""><br>
eMail (Facultatif) : <input maxlength="25" type="text" name="titrems" size="37" value=""><br>
Votre commentaire : <textarea rows="9" name="commentaire" cols="37"></textarea><br>
<?php
$var1 = array('chapeau','pantalon','tableau');
$var2 = array('rouge','marron','mauve');
$var3 = array('DSK','Sarkozy','Chirac');
$couleurfinale = $var2[rand(0,3)];
$phrase = 'Quelle est la couleur du '.$var1[rand(0,3)].' '.$couleurfinale.' de '.$var3[rand(0,3)].' ?';
$couleurep = "";
?>
<? echo $phrase;?><br>
<input maxlength="25" type="text" name="couleurep" size="37">
<br><br><INPUT TYPE="submit" value="Valider" name="submit" onClick="this.value='Patientez...';">
</form>
----------> Voilà la façon dont je le traite (édulcoré) :
$valide = 0;
if (isset($couleurep)) {
echo $couleurep." + ".$couleurfinale;
if ($couleurep==$couleurfinale) {
$valide = 1;
}
}
if ($valide = 1){
$fp = fopen("commentaires/$idcom.txt","a");
fputs($fp, "$titrems|$commentaire|$pseudo|$temps");
fputs($fp,"£");
fclose($fp);
echo("<script language=\"javascript\">alert('Votre commentaire a été enregistré');</script>");
}
else
{
echo("<script language=\"javascript\">alert('Votre message ne respecte pas la charte...');</script>");
}
----------
Je ne vois pas d'ou cela peut provenir (il faut dire que mes compétences sont limitées). Je fais un teste entre les deux variables : tirage aléatoire de la couleur et couleur rentrée par le visiteur... mais cela ne fonctionne pas car même si les deux variables sont différentes, le commentaire s'enregistre...
Merci pour vos éventuels éclaircissements et désolé pour mon incompétence :)
bg62
Messages postés
23658
Date d'inscription
samedi 22 octobre 2005
Statut
Modérateur
Dernière intervention
20 novembre 2024
2 389
24 déc. 2009 à 11:57
24 déc. 2009 à 11:57
à force d'utiliser les scripts fournis (et surtout dans les plus connus !) en ligne ... les boots s'adaptent et passent quand même ... rien de tel que d'avoir le sien (même en modifiant un peu qq chose d'existant ....)
:-)
:-)