formulaire et spam

Mammouth du PHP | 620 Messages

10 août 2013, 10:47

Bonjour,
j'ai un site internet avec un formulaire qui est spammé constamment.
au début j'avais mis un captcha et sa fonctionnait plutôt bien, plus de spam, mais depuis un certain temps le formulaire est à nouveau spammé.
j'ai donc supprimé le captcha et remplacé par un system de question du genre combien fait 4*3.
Même avec ce system toujours des spams alors j'ai en plus ajouté un champs caché qui si il est rempli annule l’envoi du formulaire....
PROBLÈME Toujours spammé !!!!

Quel faire ?

voici mon formulaire :
<form action="confvallivre.php" method="post" enctype="multipart/form-data"> 
<div align="right">Votre adresse Ip</div>
<?php
$IPClient = $_SERVER[REMOTE_ADDR] ;
print ("$IPClient") ; 
?>
<div align="right">* Nom</div>
<input class="text" type="text" name="nom" />

<div align="right">Mail</div>
<input class="text" type="text" name="email" />

<div align="right"> * Votre message </div>
<textarea onblur="calculeLongueur();" onfocus="calculeLongueur();" onkeydown="calculeLongueur();" onkeyup="calculeLongueur();" name="message" id="message" maxlength="500"></textarea>
    
<input type="hidden" id="mailrob" name="mailrob" value="" />

	<em><strong> Combien font :
	<?php
	$chiffre1 = rand(0,5); echo $chiffre1. ' + ' ;
	$chiffre2 = rand(0,5); echo $chiffre2. ' ?';
	?></em>

<input name="chiffre1" type="hidden" id="chiffre1" value="<?php	echo $chiffre1; ?>" />
<input name="chiffre2" type="hidden" id="chiffre2" value="<?php	echo $chiffre2; ?>" />
<input name="resultcalc" type="texte" id="resultcalc" value="" />

<input  name="submit2" type="submit" class="bouton" value="Valider" />

<div align="right">Les champs marqu&eacute;s d'une &eacute;toile (*) sont obligatoires </div>
</form>
et la partie traitement :
<?PHP
	$ip = $_SERVER[REMOTE_ADDR] ;
	$nom = $_POST['nom'];
	$email = $_POST['email'];
	$message = $_POST['message'];
	$mailrob = $_POST['mailrob'];
	
// antispam calcul
$chiffre1 = $_POST['chiffre1'];
$chiffre2 = $_POST['chiffre2'];
$resultcalc = $_POST['resultcalc'];
$verifresultcalc = $chiffre1 + $chiffre2 ;
if ($resultcalc != $verifresultcalc )
	{ 
	echo 'erreur antispam ! Merci de controler votre formulaire.';
	}

else {


			if ( $nom == "" ) {
			echo "<div align='center'><img src=\"../images/attention.gif\" alt=\"Attention\" /><br/>";
			
			  echo "Veuillez indiquer votre nom.<br/><a href=\"javascript:history.back()\">Retour</a></div>";
			  $erreur = true;
			}
			
			if ( $message == "" ) {
			echo "<div align='center'><img src=\"../images/attention.gif\" alt=\"Attention\" /><br/>";
			
			  echo "Veuillez indiquer un message pour le livre.<br/><a href=\"javascript:history.back()\">Retour</a></div>";
			  $erreur = true;
			}
		
		if ( $mailrob != "" ) {
			echo "<div align='center'><img src=\"../images/attention.gif\" alt=\"Attention\" /><br/>";
			
			echo "Erreur !!!!!! <br/><a href=\"javascript:history.back()\">Retour</a></div>";
			  $erreur = true;
			}	
			
		/* Envoi du mail */
		if ( !$erreur ) {
		
		$msg .= "Nom :\t$nom\n";  
		$msg .= "Message :\t$message\n"; 
		$msg .= "email :\t$email\n";
		$msg .= "ip :\t$ip\n";

		mail('[email protected]', 'Nouveau message ', $msg , 'From: [email protected]'); 
		echo 'Merci, votre message nous a été transmit'; 
		
		}
		}
?> 
<?php  echo '<a href="javascript:history.back();">Retour</a>'; ?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 août 2013, 11:21

salut,


ne passe pas par le formulaire les chiffres permettant de faire le calcul si non c'est trop simple de te spammer, il suffit de remplir avec des valeurs connues et de mettre le résultat dans le bon champs (si tu log tout les accès au formulaire il y a de grande chance pour que tu y retrouve toujours les mêmes valeurs.

quand tu affiche le formulaire tu garde en session la valeur du résultat et a la validation tu compare le résultat entré dans le formulaire et le résultat en session.

Déjà la tu éviteras la possibilité de choisir les chiffres du calcul :)

Tu peux choisir aléatoirement l'opérateur (addition, soustraction ou multiplication car de 0 à 10 les combinaisons sont simple).

Ce type question basique est pas trop mal mais il est possible de parser l'affiche html et de renvoyer une réponse cohérente.
Par exemple si tu écris <p>Question anti spam<br />Combien font 8 + 10 ?</p> ce n'est pas trop compliqué de récupérer 8+10 et de faire un eval dessus pour avoir la réponse et la du coup ta question antispam ne sert plus a rien.

Pour palier à cela tu peu imaginer des questions "texte" avec une réponse simple à deviner, genre
- qu'elle est la couleur du cheval blanc d'Henri 4 ?
- qu'elle est la lettre en double dans php

La sauf en se tapant toute les questions à la main pour créer un dictionnaire c'est déjà plus compliqué de te spammer tout en gardant le même principe.
Le tout c'est d'avoir des questions assez simple (où tout le monde peu répondre sans avoir 400 de QI ;) ), diversifiée et "en grand nombre".
Par exemple : comment s'appel le copain d'Obélix / astérix / le chien d'Obélix etc : il y a peu de chance que l'on te réponde obélisque ou astérisque mais on ne sais jamais :)) (l'inverse par contre n'est pas à faire : qui y a t'il place de la concorde : un obélix ? .... :) )

Après les systèmes de captcha avec des images sont plus complexe à décoder car il fuat un système d'OCR mais c'est possible, d'où les polices globalement illisibles que l'on y trouve généralement. De plus ce type de captcha n'est pas du tous accessible (impossible pour les non voyants de les utiliser d'où parfois le lecteur audio associé).

Perso ma préférence va à la solution avec phrase, même s'il n'y a pas de solution miracle.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

12 août 2013, 11:21

à partir de la réponse de moogli, une suggestion:
mettre en BDD une série d'opérations sous forme de texte:
Combien vaut l'addition de SIX et SEPT?TREIZE
Quel nombre obtient-on en mettant côte à côte DEUX et DEUX? VINGT-DEUX.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD