8791 sujets

Développement web côté serveur, CMS

Je subis des attaques de spams sur mon livre d'or du genre :
a écrit :

hEjoDefiLyIbeE a écrit :
comment3, <a href="http://acfhdcz.2y.net/">bullshit five mom</a>, bullshit five mom, http://acfhdcz.2y.net/ bullshit five mom, %)), <a href="http://onadgyh.xana.fr/">slip calmly hawk</a>, slip calmly hawk, http://onadgyh.xana.fr/ slip calmly hawk, cjd, <a href="http://wknurnd.dlinkddns.com/">curb drag path</a>, curb drag path, http://wknurnd.dlinkddns.com/ curb drag path, jwn, <a href="http://tjnuwzy.dlinkddns.com/">focus series honest</a>, focus series honest, http://tjnuwzy.dlinkddns.com/ focus series honest, =OO, <a href="http://ybarqsx.dlinkddns.com/">route cigarette kid</a>, route cigarette kid, http://ybarqsx.dlinkddns.com/ route cigarette kid, 249, <a href="http://dxwtanc.xana.fr/">harm rose lip</a>, harm rose lip, http://dxwtanc.xana.fr/ harm rose lip, xqc, <a href="http://oqgfmpq.xana.fr/">into urge wild</a>, into urge wild, http://oqgfmpq.xana.fr/ into urge wild, zlrm, <a href="http://vumnorl.2y.net/">button clearly stern</a>, button clearly stern, http://vumnorl.2y.net/ button clearly stern, mmtyl, <a href="http://hgkgejk.2y.net/">recently belt rise</a>, recently belt rise, http://hgkgejk.2y.net/ recently belt rise, 778, <a href="http://cihtrno.xana.fr/">wink shock cheek</a>, wink shock cheek, http://cihtrno.xana.fr/ wink shock cheek, :-O,

j'ai pourtant mis un script qui lutte contre le spam (qui détecte si la personne est sur le serveur) :
$value = explode('/',$_SERVER['HTTP_REFERER']);
   if ($value[2] != "monbeausite.ext")  // ici tu met ton nom de domaine
   {
       echo "Vous ne pouvez poster des commentaires que depuis le site !";
       exit();
   }

J'essaye d'évité les capcha et autres champs cachés pour des raisons accessibilité. Il y a t'il une solution transparente pour l'utilisateur ?
Merci de votre aide
Doc Mcfly
PS : je recois environ 50 messages qu'avec les bots, sur un site ou pratiquement que moi vait.
Modifié par doc mcfly (23 Dec 2010 - 09:00)
Modérateur
Bonjour,

Le REFERER n'est pas fiable. Il peut être modifié par l'utilisateur, ce qui inclus les bots.

Tu peux déjà détecter si le message contient trop d'urls et empêcher son envoi.
Modifié par Tony Monast (22 Dec 2010 - 19:56)
Modérateur
Je vois...

L'exemple de code que j'ai donné est plutôt simple. C'est pourquoi il serait préférable que tu étudies attentivement les bases de PHP. J'ai entendu de bons commentaires sur les tutoriaux du site du zéro.

Autrement, tu vas toujours bloquer sur tout ce que tu voudras faire.

a écrit :
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
j'ai mis un <input type="submit" value="Envoyer" disabled="disabled"/> et pourtant un bot a poster dessus ! comment fait-il ?
Modérateur
Un bot n'a pas besoin d'utiliser ton formulaire pour envoyer son message. Il a juste à connaître l'adresse du script qui traite ton formulaire et il lui envoi les champs appropriés.
une question : est-ce que ce script peut contrer ou pas :
if (eregi('http://', $var1) || eregi('http://', $var2) || eregi('http://', $var3)) { 
}else{ 
$value = explode('/',$_SERVER['HTTP_REFERER']); 
   if ($value[2] != "monsite.fr")  // ici tu met ton nom de domaine 
   { 
       echo "Vous ne pouvez poster des commentaires que depuis le site !"; 
       exit(); 
   }
   }
Modérateur
En théorie, ça devrait fonctionner, mais je ne vois pas la partie de code qui envoi le message, alors difficile de te le confirmer. Il faudrait que je vois le code complet pour te dire si tu as mis ta condition au bon endroit.

Dès qu'il y aura le mot http:// quelque part dans le message, ça n'enverra pas de message. Le mieux est d'en aviser l'utilisateur, au cas où un utilisateur légitime voudrait partager un lien dans ton livre d'or.

Pour t'assurer que ça fonctionne, test ton formulaire avec les messages des robots que tu as reçu. Tu verras tout de suite si ton code est bon.
Modifié par Tony Monast (22 Dec 2010 - 21:14)

$pseudo = $_POST['pseudo'];
$message = $_POST['message'];
if (eregi('http://',$pseudo ) || eregi('http://', $message)) {  
}else{  
$value = explode('/',$_SERVER['HTTP_REFERER']);  
   if ($value[2] != "monsite.fr")  // ici tu met ton nom de domaine  
   {  
       echo "Vous ne pouvez poster des commentaires que depuis le site !";  
       exit();  
   } 
   }
 include ("includes/connection.php"); 
// --------------- Etape 1 -----------------
// Si un message est envoyé, on l'enregistre
// -----------------------------------------
 
if (isset($_POST['pseudo']) AND isset($_POST['message']))
{
$value = explode('/',$_SERVER['HTTP_REFERER']);
   if ($value[2] != "monsite.fr")  // ici tu met ton nom de domaine
   {
       echo "Vous ne pouvez poster des commentaires que depuis le site !";
       exit();
   }


 $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo'])); // On utilise mysql_real_escape_string et htmlspecialchars par mesure de sécurité
    $message = mysql_real_escape_string(htmlspecialchars($_POST['message'])); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
 
    // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
}
 
// --------------- Etape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------
 
// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}

 
 
// --------------- Etape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
 
if (isset($_GET['page']))
{
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
        $page = 1; // On se met sur la page 1 (par défaut)
}
 
// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
 
$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
 
while ($donnees = mysql_fetch_array($reponse))
{
        echo '<p><b>' . stripslashes($donnees['pseudo']) . '</b> a écrit :<br />' . stripslashes($donnees['message']) . '</p>';

}
mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)

ça pas l'air de marcher Smiley fache !
Modifié par doc mcfly (23 Dec 2010 - 08:55)
Modérateur
C'est normal, la condition est bien là, mais elle n'arrête pas le script pour autant.


if (eregi('http://',$pseudo ) || eregi('http://', $message)) {  
// C'est ici que tu dois arrêter le script.

 
}else{   
$value = explode('/',$_SERVER['HTTP_REFERER']);   
   if ($value[2] != "monsite.fr")  // ici tu met ton nom de domaine   
   {   
       echo "Vous ne pouvez poster des commentaires que depuis le site !";   
       exit();   
   }  
   } 
 include ("includes/connection.php"); 


J'imagine qu'un echo avec un message d'erreur et un exit(); pour arrêter le script suffira, là où j'ai mis une commentaire dans ton code. En temps normal, je ne le ferais pas comme ça, mais bon, si ça peut te dépanner le temps que tu maîtrises mieux le PHP...

Sinon, je vais laisser les autres membres t'aider. Je ne suis pas spécialisé en PHP et je tombe en vacances ce soir! Smiley biggrin Quand je suis en vacances, j'ai tendance à faire autre chose que de l'informatique.
Modifié par Tony Monast (22 Dec 2010 - 21:47)