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
Bonjour,

Je suis a la recherche script PHP anti-spam ou Captcha simple d'utilisation mais bien sur efficace
Ca fonction serait de supprimer le spam sur le formulaire d'inscription et de contact a un de mes site en php

Après recherche sur le forum il y en a beaucoup de différents et comme je ne suis pas un pro en php je souhaite pas me prendre la tête a ajouter un script qui serait trop complexe ou inefficace.

alors merci de vos suggestion
A voir également:

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
un captcha tout simple et efficace :
<?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
8
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
Cryptographp est très bien.
2
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
Voici le code d'un fichier anti-spam.php qui crée une image captcha:

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.

@+
2
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
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 !
0
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
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 :

<?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
0
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
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
0
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
salut web_traveller

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&eacute;rification suivant :</td>
                        </tr>
                        <tr>
                          <td>&nbsp;</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&eacute;n&eacute;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
0
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
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
0
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
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
0

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 :)
0
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
à 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 ....)
:-)
-1