Empecher les meesages intempestifs sur mon livre d'Or

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Empecher les meesages intempestifs sur mon livre d'Or

par Berzemus » 13 nov. 2007, 11:51

J'appliquerais vraiment la solution de Cyrano, hakazizi, elle me semble la plus mieux.

par hakazizi » 13 nov. 2007, 00:25

ou alors quelque chose comme cela.
<table width="256">
      <tr>
        <td width="256"><div align="center"><span style="color: #000000"><span class="Style10">code de verifcation :<br>
combien font <br>
<?php 
$rand=rand(0,5);
$rand1=rand(0,5);
$codeverif1=$rand+$rand1;
$i=rand(0,25);
$alpha=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); 
$rand2=$alpha[$i];
$codeverif2="$codeverif1$rand2";
$codeverif=md5("$codeverif2");
echo"".$rand." plus ".$rand1." ajoutez lui la lettre ".$rand2." à la fin sans espace"; ?>

</span></span></div></td></tr><tr>
        <td width="256"><div align="center"><span style="color: #000000">
            <input name="codeverif" type="text" class="Style10" id="codeverif" size="15">
<input name="codeverif1" type="hidden" class="Style10" id="codeverif1" value="<?php echo"".$codeverif.""; ?>">
et en recuperation
<?php
$codeverif2 = htmlentities($_POST['codeverif']);
$codeverif = md5("$codeverif2");
$codeverif1 = htmlentities($_POST['codeverif1']);
if($codeverif != $codeverif1)
{
$reponse = "Le code de securité n'est pas correct";
echo"<SCRIPT LANGUAGE=\"JavaScript\">
document.location.href=\"connection.php\"</SCRIPT>";
exit();
} 
?>
quelque chose me dit que l'on peu encore amelioré se point mais je n'arrive pas a trouvé .

par Berzemus » 12 nov. 2007, 14:47

Autre méthode possible, je l'ai mise en place sur le LO de ma page perso et ça fonctionne particulièrement bien : là où tu as un textarea pour saisir le message à poster, utilise une ruse qu'aucun robot ne peut comprendre pour le moment : renomme ton textarea : name="spam" : ensuite, ajoute un autre textarea avec le nom original que tu as remplacé par spam mais ajoute lui un id et dans une feuille de style externe, ajoute sur ce second textarea "display: none".

Dans le traitement, vérifie s'il y a un contenu dans le textarea qui a un nom "en apparence normal" : si c'est le cas, tu vire, l'internaute normal ne voit pas ce champ et ne peut rien y inscrire, donc c'est un robot qui l'a rempli, le contenu normal devant se trouver dans le textarea "spam" (Ca, l'internaute ne le sait pas, et le robot ne mettra à priori rien dedans, ce qui fait que le message normal serait en plus vide donc sujet à rejet lors de la validation).

De cette manière, pas besoin de captcha et je n'ai plus eu à supprimer de spam depuis le mois de juillet dernier.
De fait, j'avais zappé, honte à moi.

Très chouette solution. =D>

par Truc » 12 nov. 2007, 12:51

La couleur du cheval blanc d'Henri IV ?
L'age du capitaine à sa naissance ?
:roll:

Cyrano a donné une très bonne solution.

par Berzemus » 12 nov. 2007, 11:35

Je dirais, pour être pédant, que le champ "4+4", c'est un peu banal, et qu'un robot pourrait facilement l'analyser et faire l'addition..

Je demanderais plutôt une question du genre "Quelle est la capitale de" (en évitant de demander celles de la Moldavie, d'Eritrea ou de Palau), plus compliqée.

par Cyrano » 12 nov. 2007, 07:08

J'avoue que le coté technique de reproduire le formulaire m'échappe un peu.
"Affichage > Source de la page", tu connais ? ;)
les fonction javascript doivent-etre utilisé pour le confort de l'utilisateur il serait tres risqué de basé une protection sur du javascript.
Et surtout, le JavaScript étant coté client, il est accessible à tous les internautes, incluant bien entendu les spammeurs : ils peuvent donc l'analyser et trouver une manière de contourner les validations. Donc si tu ajoutes une validation JavaScript, c'est bien pour améliorer le confort d'utilisation pour l'internaute normal, mais ça ne te dispense pas de faire la même chose en PHP coté serveur : pour l'internaute normal, ça ira plus vite puisque les données arriveront déjà valides, mais pour le spammeur qui aura bidouillé les données, il sera intercepté.

par hakazizi » 12 nov. 2007, 01:25

Cyrano,

J'avoue que le coté technique de reproduire le formulaire m'échappe un peu.

D'autre part dois je comprendre que les fonctions javascript ne servent à rien.

Et finalement pourquoi cela marche chez Power Web

Merci de ton aide
les fonction javascript doivent-etre utilisé pour le confort de l'utilisateur il serait tres risqué de basé une protection sur du javascript.
un robot est lui meme un script dans le cas present.
il n'a donc pas de navigateur pour l'interpreté...
Si, tu met une question de ce style :
Combien font 2 + 2 ?

Et avant d'enregistrer le message tu fais une condition PHP qui accepte 4 et quatres ;) Moi j'utilise ça et ça marche très bien !
oui pas mal mais pour etre efficace il faut que cela soit aleatoire...

par iclo » 12 nov. 2007, 01:20

Oui, le robot ne vas pas s'amuser à executer du code Js, donc une protection faisant appel à du Js semble tout à fait inutile.

par Photographiquement Vôtre » 12 nov. 2007, 00:31

Cyrano,

J'avoue que le coté technique de reproduire le formulaire m'échappe un peu.

D'autre part dois je comprendre que les fonctions javascript ne servent à rien.

Et finalement pourquoi cela marche chez Power Web

Merci de ton aide

par Photographiquement Vôtre » 12 nov. 2007, 00:31

Cyrano,

J'avoue que le coté technique de reproduire le formulaire m'échappe un peu.

D'autre part dois je comprendre que les fonctions javascript ne servent à rien.

Et finalement pourquoi cela marche chez Power Web

Merci de ton aide

par Cyrano » 11 nov. 2007, 23:06

Ils reproduisent ton formulaire en local et envoient les données en $_POST, donc les protections JavaScript sont court-circuitées.

Personne n'a réagi, mais tu devrais regarder de plus près la suggestion que j'ai faire plus haut. Encore une fois, j'ai mis ça en place en juillet et je n'ai plus jamais eu de problème de spam, le seul que j,aie du supprimer avait été écrit manuellement sur un autre exemplaire de ce LO que j'avais installé sur un autre site.

Le JavaScript, c'est ok pour faire une pré-validation pour l'internaute normal, ensuite, c'est coté serveur que ça se passe et où ta validation aura un effet. Et en utilisant pas de captcha, tu laisse le LO accessible.

Enfin bon, tu fais comme tu veux hein ? ;)

par Photographiquement Vôtre » 11 nov. 2007, 21:37

Merci pour vos conseils.

Une chose que je ne comprends pas :

avec mes controles, moi quand je mets un chiffre erroné j'ai un message d'erreur.

Comment font les spameurs pour passer outre ?

par Power Web » 11 nov. 2007, 20:56

Avec un lien javascript back les champs sont toujours remplis :wink:

Code : Tout sélectionner

<a href="javascript:history.back(-1)">Retour</a>

par Berzemus » 11 nov. 2007, 20:42

J'essayerais aussi une alerte javascript dans le cas d'une mauvaise réponse.

Rien de plus énervant que de devoir retourner en arrière et tout retaper.

par Power Web » 11 nov. 2007, 20:08

Tiens essais ça :
<h1 align="center" class="titre">Message pour le livre d'or</h1>
<?php
$table = "tbllivredor";
$tableprepa = "tbllivrePrepa";
$page = $_SERVER ["PHP_SELF"];
$adminemail = "[email protected]";

    
if(isset($_POST['envoi'])) 
{
	if ( isset($_POST["nom"]) && isset($_POST["prenom"]) && isset($_POST["pays"]) && isset($_POST["email"]) && isset($_POST["message"]) && isset($_POST["code"])) 
	{ 
		$nom = htmlspecialchars(stripslashes($_POST["nom"]), ENT_QUOTES);
		$prenom  = htmlspecialchars(stripslashes($_POST["prenom"]), ENT_QUOTES);
		$pays = htmlspecialchars(stripslashes($_POST["pays"]), ENT_QUOTES);
		$email = htmlspecialchars(stripslashes($_POST["email"]), ENT_QUOTES);
		$message = htmlspecialchars(stripslashes($_POST["message"]), ENT_QUOTES);   
		$code = htmlspecialchars(stripslashes($_POST["code"]), ENT_QUOTES);   
    
		if(empty($nom)) { echo "<h3 align=center><strong>Vous devez remplir le nom</h3>"; }    
		if(empty($prenom)) { echo "<h3 align=center><strong>Vous devez remplir le prénom</h3>"; }
		if(empty($email)) { echo "<h3 align=center><strong>Vous devez remplir l'email</h3>"; }    
		if(empty($message)) { echo "<h3 align=center><strong>Vous devez remplir le message</h3>"; }        
		if(empty($code)) { echo "<h3 align=center><strong>Vous devez remplir le code</h3>"; }        
          
		else
		{
			if ($code == "5" || $code == "cinq")
			{
				echo "<h3 align=\"center\"><strong>Merci d'avoir laissé un message</strong></h3>";
		     
				$date = date("d/m/y"); 
				$query = "INSERT INTO $tableprepa VALUES('$date','$nom','$prenom','$pays','$email','$message')"; 
				$result = mysql_query($query)or exit ('Erreur SQL !'.$result.'<br />'.mysql_error()); 
        
				$sujet  = "Message sur votre Livre d'Or"; 
				$corps  = "Nom: ".$nom."\r\n"; 
				$corps .= "Prénom: ".$prenom."\r\n"; 
				$corps .= "Date: ".$date."\r\n"; 
				$corps .= "Message: ".$message."\r\n"; 
				$entete = "From: ".$email."\r\n"; 
            
				mail($adminemail,$sujet,$corps,$entete); 
			}
			
			else
			{
				echo "<h3 align=center><strong>L'addition n'est pas bonne</strong></h3>";
			}            
	    }
		
		echo '<p align="center"><a href="livredor.php#ancre_formu">Retourner sur le livre d\'or</a></p>';
	} 
}	
?>