[PHP] Anti-spam

Résolu/Fermé
Carotte77 Messages postés 543 Date d'inscription mardi 19 décembre 2006 Statut Membre Dernière intervention 30 juin 2011 - 10 mars 2007 à 01:19
 Besdu06 - 1 juil. 2011 à 11:41
Bonjour,

Sur mon site ( http://objectifplanete.ovh.org ), j'ai créé un livre d'or (consultable sur http://objectifplanete.ovh.org/livredor.php ). Depuis quelques semaines, je me fais assaillir de spams par des robots-spammeurs. J'ai donc décidé d'utiliser une sorte de "Captcha" (ou anti-spam) consistant en une suite de numéros devant une image brouillée. J'ai récupéré le code sur le site du Zéro (très bon tutos pour les apprentis du webmastering) que j'ai appliqué à mon site.

L'anti-spam s'affiche bien, j'ai mon image brouillée avec mes chiffres, ma case ou je peux réécrire le code. Seulement problème : lorsque je rentre un mauvais code, le message est tout de même posté.

En gros : on écrit son message sur livredor.php, on clique sur envoyer, les variables sont traitées par message.php, qui écrit le message dans message.txt si tout est ok. Ensuite, l'utilisateur clique pour consulter le livre d'or. La page consultezlo.php met en forme le fichier message.txt et l'internaute a alors accès à la liste des posts.

Pour en revenir à l'anti spam, j'ai récupéré le code de traitement de l'anti spam et l'ai copié/collé sur ma page message.php, celle qui traite les variables. j'ai ajouté le code d'affichage de l'anti spam sur ma page livredor.php.

Voila le code de message.php (a priori le seul à modifier).

Cette partie sert pour l'anti-spam :

<?php

// Code PHP pour l'image brouillée et le code chiffré à entrer
session_start(); // L'image utilise les sessions, donc on les active ici car on as besoin de ces informations
$debut_html = '<html>
<head>
<title>Inscription</title>
</head>
<body>
<p>';
$milieu_html = NULL;
$fin_html = '</p>
</body>
</html>';

if(IsSet($_POST['verif_code']) AND !Empty($_POST['verif_code'])) { // Le champ du code de confirmation a été remplis
     if($_POST['verif_code']==$_SESSION['aleat_nbr']) { // Si le champ est égal au code généré par l'image
          $milieu_html = 'Vous avez entré le bon code de confirmation !';
     }
     else {
          $milieu_html = 'Votre code de confirmation n\'est pas bon ! Merci de réessayer.<br /><a href="#" onclick="history.go(-1);">Retour</a>';
     }
}
else {
    $milieu_html = 'Vous devez remplir le champ du code de confirmation !';
}


Celle-ci sert pour la vérification l'écriture du message dans message.txt :

//Code PHP pour le livre d'or

// Là, on affiche toute la source générée :
echo $debut_html . $milieu_html . $fin_html;

   
// Pour éviter qu'une unique personne poste 50 fois dans le livre d'or, on va insérer un cookie
setcookie("ip",$_SERVER['REMOTE_ADDR'],time()+.3600*60*90);

// Si le cookie est égale à l'ip du client alors on le stop
if(isset($_COOKIE['ip']) && $_COOKIE['ip']==$_SERVER['REMOTE_ADDR'])
{
        echo "<h1>Vous ne pouvez émettre qu'un seul avis et vous l'avez déjà donné !</h1>";

        // On stop le script
        exit;
}
// Mettons le (futur) fichier dans une variable.
$commentaires="messages.txt";

// assignons nos 2 variables du formulaire et on en profite pour les protégers des balises HTML
$pseudo=htmlentities($_POST['pseudo']);
$message=htmlentities($_POST['message']);

//Pensons au retour à la ligne et au stripslashes pour la variable $message
$message=stripslashes(nl2br($message));

// On met en place quelques conditions pour les cellules (nom et message)
// On vérifie avant tout si le fichier existe si ce n'est pas le cas on le crée
if(!is_file($commentaires))
{
        $verif=@fopen($commentaires,"w+");
}

// On vérifie que le login ou le message ne soient pas vide
elseif (trim($message)=="" || trim($pseudo)=="")
{
        echo "Vous devez remplir tous les champs ! <a href=\"livredor.php\">Retour sur le livre d'or</a>";
       
        // On sort du script !
        exit;
}


// Après ces quelques vérification d'usage on passe  à l'exécution de ce formulaire

       
        // Si ok on ouvre en écirture-enregistrement du fichier message.txt
        $verif=@fopen($commentaires,"r+");
               
        // On analyse les anciennes données et on les stocks
        $stock=@fread($verif,filesize($commentaires));
       
        // On met la date dans une varialbe
        $date=date ("d/m/Y à H:i");
       
        // On paramère le tout dans la variable $opinion
        $opinion="<b>".$pseudo."</b> a écrit le : ".$date."<br />\n".$message."<br />\n<hr />";
       
        //On remet le curseur du fichier en début de ligne
        rewind($verif);
       
        //On insère le nouveau commentaire
        fputs($verif,$opinion." \n".$stock);
       
        //On clore le fichier
        fclose($verif);
       
        // On affiche le tout
        readfile($commentaires);


?>


En fait je voudrais, en utilisant comme base la 2e partie, y incruster la 1ere. Avec toutes les instructions de la 2e, je voudrais que le message posté par l'internaute ne soit traité que si le code est bon (inutile alors d'avoir un echo, si le code est bon, on execute, sinon, on affiche un echo affirmant que le code est faux et un lien retour sur la page).

J'ai eu beau essayer toutes les configurations possibles, je n'ai pas réussi. il faut dire que je suis tout nouveau en PHP et que je n'y comprend pas encore grand chose...

Quelqu'un peut-il m'aider ?
Désolé pour la longueur du post :S et merci d'avance pour votre aide !
A voir également:

3 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
14 mars 2007 à 17:44
Rien de plus simple, ta premiere partie doit etre comme ca :
<?php

// Code PHP pour l'image brouillée et le code chiffré à entrer
session_start(); // L'image utilise les sessions, donc on les active ici car on as besoin de ces informations
$debut_html = '<html>
<head>
<title>Inscription</title>
</head>
<body>
<p>';
$milieu_html = NULL;
$fin_html = '</p>
</body>
</html>';

if(IsSet($_POST['verif_code']) AND !Empty($_POST['verif_code'])) { // Le champ du code de confirmation a été remplis
     if($_POST['verif_code']!=$_SESSION['aleat_nbr']) {  
          $milieu_html = 'Votre code de confirmation n\'est pas bon ! Merci de réessayer.<br /><a href="#" onclick="history.go(-1);">Retour</a>';
      exit(-1);
     }
}
else {
    $milieu_html = 'Vous devez remplir le champ du code de confirmation !';
   exit(-1)
}


ET ICI TU MET LA DEUXIEME PARTIE DU SCRIPT

?>


Ainsi dans la premiere partie, en cas d'erreur la suite n'est pas exécutée, et donc tes messages non mis à jour, normalement.
2
Carotte77 Messages postés 543 Date d'inscription mardi 19 décembre 2006 Statut Membre Dernière intervention 30 juin 2011 539
14 mars 2007 à 23:12
Tout d'abord, merci pour ta réponse !

J'ai un tout petit problème. J'ai fait ce que tu m'as dit de faire, et j'obtiens un message d'erreur :


Parse error: syntax error, unexpected '}' in /home/o/b/j/objectifplanete/www/message.php on line 25

La ligne 25 correspond à l'accolade de toute fin de ce passage du code :

else {
    $milieu_html = 'Vous devez remplir le champ du code de confirmation !';
   exit(-1)
}


J'ai essayé de corriger l'erreur, mais j'obtiens toujours le message d'erreur...

As-tu une idée ?

merci d'avance
2
Bonjour,
rajoute un point-virgule après "exit(-1)", ça devrait aller mieux,

Rémy
0
Carotte77 Messages postés 543 Date d'inscription mardi 19 décembre 2006 Statut Membre Dernière intervention 30 juin 2011 539
12 mars 2007 à 14:37
S'il vous plait, je me fais toujours assaillir de spams... Quelqu'un peut-il m'aider à otpimiser et simplifier mon code ?
0
Bonjour Carotte77, Je viens un peu tard sur le forum mais as tu trouvé ta réponse? J'ai exactement le meme problème que toi!

Merci pour ton aide
Bes
0