Rechercher : dans
Par :

[PHP] Anti-spam

Dernière réponse le 8 jun 2007 à 20:18:37 Carotte77, le 10 mar 2007 à 01:19:01 
 Signaler ce message aux modérateurs

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 ! Cochez "Problème résolu" au début de la discussion lorsque votre problème est résolu ! Merci ;)
Configuration: Windows XP
Firefox 2.0.0.2
IE 7.0
Notepad++ v4.0.2

Meilleures réponses pour « [PHP] Anti spam » dans :
[Free] Activer le filtre anti-spam Voir C'est une fonction peu connue, mais Free propose un anti-spam gratuitement. Il est relativement efficace. Il suffit de l'activer sur votre boite mails. Les mails identifiés comme spam n'arriveront même pas jusque dans votre boite email (ce qui évite...
Lutter contre le spam VoirObjectif des spammeurs Trouver des adresses emails valides Spammer Si possible anonymement Ou peut-être bientôt, légalement Eviter de communiquer son adresse Que proposent les FAI actuellement ? Installer un soft anti-spam Que dit la loi...
Quel est le meilleur anti-virus ? VoirC'est une question qui est très souvent posée dans le forum et les débats sont très souvent animés. Certains pensent que les meilleurs anti-virus sont ceux ci-dessous : ANTIVIR AVAST AVG Gdata Bit Defender
PHP - Code antispam avec chiffres et lettres (CAPTCHA) VoirSur de nombreux sites, dont CommentCaMarche, les formulaires sont accompagnés d'un encart demandant de recopier un code généré aléatoirement. Un tel système, appelé CAPTCHA, permet de limiter les envois abusifs automatisés (SPAMS). Les sites...
Télécharger SPAMfighter VoirSpamFighter est un Filtre Anti Spam gratuit pour Outlook et Outlook Express éliminant automatiquement les messages indésirables (spam). SPAMfighter se base sur ses 3.113.185 utilisateurs dans 215 pays pour repérer les spams. Lorsque plusieurs...
Télécharger AVG Anti-Rootkit Voir"Etant donné que les applications AVG Anti-Spyware et AVG Anti-Rootkit sont dorénavant incluses dans les versions commerciales d'AVG, les mises à jour seront bientôt interrompues." http://gratuit.avg.fr/telecharger-avg-anti-spyware-et-anti-rootkit
Spam (pollupostage) VoirIntroduction au spam Depuis que le World Wide Web existe, les ressources se sont démocratisées et le flux d'informations circulant sur le réseau des réseaux n'a cessé d'augmenter. Cependant le contenu de ces informations n'a pas toujours...

1

Carotte77, le 12 mar 2007 à 14:37:00

S'il vous plait, je me fais toujours assaillir de spams... Quelqu'un peut-il m'aider à otpimiser et simplifier mon code ? Cochez "Problème résolu" au début de la discussion lorsque votre problème est résolu ! Merci ;)

Répondre à Carotte77

2

kij_82, le 14 mar 2007 à 17:44:58
  • +1

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.
~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82

3

Carotte77, le 14 mar 2007 à 23:12:42
  • +1

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 Cochez "Problème résolu" au début de la discussion lorsque votre problème est résolu ! Merci ;)

Répondre à Carotte77

4

 rémy, le 8 jun 2007 à 20:18:37

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

Rémy

Répondre à rémy
Collection CommentÇaMarche.net