Menu

Recherche script PHP anti-spam ou Captcha [Fermé]

Messages postés
33
Date d'inscription
jeudi 28 février 2008
Dernière intervention
10 juin 2008
- - Dernière réponse :  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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
23178
Date d'inscription
samedi 22 octobre 2005
Statut
Contributeur
Dernière intervention
20 mars 2019
3145
8
Merci
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

Dire « Merci » 8

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 47245 internautes nous ont dit merci ce mois-ci

Messages postés
18265
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
23 mars 2019
5025
2
Merci
Cryptographp est très bien.
Messages postés
502
Date d'inscription
jeudi 14 mai 2009
Dernière intervention
10 mars 2010
52
2
Merci
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.

@+
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
6 juin 2008
1
0
Merci
Salut Stefart,

C'est tout expliqué ici :
http://www.6ma.fr/tuto/image+securite+pour+formulaires+php-357

Je ne sais pas quel est ton niveau en PHP mais j'espère que ca pourra t'aider.

Bonne chance !
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
6 juin 2008
1 > stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Dernière intervention
10 juin 2008
-
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/...

J'espère que ça va marcher pour toi !

Web Traveller
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Dernière intervention
10 juin 2008
> web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
6 juin 2008
-
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
web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
6 juin 2008
1 > stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Dernière intervention
10 juin 2008
-
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
stefart
Messages postés
33
Date d'inscription
jeudi 28 février 2008
Dernière intervention
10 juin 2008
> web_traveller
Messages postés
11
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
6 juin 2008
-
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
Bon tutoriel, je viens tous juste de l'adapter a mon formulaire d'inscription et c'est ok, merci beaucoup
0
Merci
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 :)
Messages postés
23178
Date d'inscription
samedi 22 octobre 2005
Statut
Contributeur
Dernière intervention
20 mars 2019
3145
-1
Merci
à 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 ....)
:-)