Forum Clubic

PHP - Créer un formulaire antispam

Je suis nul en php
Je voudrais réaliser un formulaire simple avec les conditions suivantes :

  • protection antispam sans captcha
  • que le formulaire me soit adressé directement sans passer par un logiciel de messagerie (exemple outlook express)
    Si quelqu’un peut m’aider, je le remercie d’avance :wink:

Tu mes un champ de type text que tu appelle name par exemple et tu le cache avec hidden, tes visiteurs peuvent pas le voir par contre l’abruti de bot, va se jeter dedans avec un-peu de chance

donc quant tu récupère si ce champ est rempli il y a des chance que ce soit un bot

il doit y avoir d’autre solution en javascript. ( par contre si le visiteur n’a pas le javascript activé, il va passer pour un bot aussi :slight_smile: )

Antispam sans captcha c’est compliqué… Faut voir avec le hidden, mais la personne qui utilise un bot est un minimum intelligent… En JS tu met un Il faut le javascript puis tu doit savoir en faisant un navigator.appName mais yen a beacoup et les bots là aussi se font passer pour des navigateurs normaux…

Ce que j’avais fait à l’époque, c’est de nommer aléatoirement les champs du formulaire, cela fonctionnait pas mal même si les bots ont évolués.

La solution est en revanche simple : il te suffit juste de conserver en session le mapping nom aléatoire = contenu, et au lieu d’avoir :

Tu auras :

Ce n’est pas infaillible.

J’ai trouvé le script suivant qui a l’air satisfaisant mais malheureusement pas protégé contre le spam (si quelqu’un a une idée pour le protéger…):

<?php

// N'afficher que les erreurs, pas les avertissements...
ini_set("error_reporting", "E_ALL & ~E_NOTICE");

// Adresse de réception du formulaire
$email_dest = "mon.email@monfai.fr";

if ($_POST['envoi']) {

// E-mail headers:
$headers ="MIME-Version: 1.0 \n";
$headers .="From: site www.monsite.net<webmaster@monsite.net>\n";


$headers .="Content-Type: text/html; charset=iso-8859-1 \n";

$subject = "chamari.net";

$partie_entete = "<html><head>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>
</head>
<body bgcolor=#FFFFFF>";

for ($a=1; $a<= $_POST['nbre_champs_texte']; $a++) {
$partie_champs_texte .= "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_champ'.$a] . " = " . $_POST['champ'.$a] . "</font><br>";
}

if ($_POST['nbre_zone_email'] != 0) {
$partie_zone_email = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_email'] . " = " . $_POST['zone_email'] . "</font><br>";
}

if ($_POST['nbre_zones_texte'] != 0) {
$partie_zone_texte = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_zone'] . " = " . $_POST['zone_texte'] . "</font><br>";
$partie_zone_texte = stripslashes($partie_zone_texte);
}

$fin = "</body></html>";

$sortie = $partie_entete . $partie_champs_texte . $partie_zone_email . $partie_zone_texte . $fin;

// Send the e-mail
if (@!mail($email_dest,$subject,$sortie,$headers)) {
echo("Envoi du formulaire impossible");
} else { // Closing if !mail...

// Renvoi à la page de remerciement

exit();

} // Fin du else
} // Closing if edit
?>
<html>
<head>
<title></title>
<script language="JavaScript">function verifSelection() {if (document.mail_form.champ1.value == "") {
alert("Veuillez saisir votre nom")
return false
} if (document.mail_form.champ2.value == "") {
alert("Veuillez saisir votre prénom")
return false
} if (document.mail_form.zone_email.value == "") {
alert("Veuillez saisir votre email")
return false
}

invalidChars = " /:,;'"

for (i=0; i<invalidChars.length; i++) {	// does it contain any invalid characters?
badChar = invalidChars.charAt(i)

if (document.mail_form.zone_email.value.indexOf(badChar,0) > -1) {
alert("Votre adresse e-mail contient des caractères invalides. Veuillez vérifier.")
document.mail_form.zone_email.focus()
return false
}
}

atPos = document.mail_form.zone_email.value.indexOf("@",1)			// there must be one "@" symbol
if (atPos == -1) {
alert('Votre adresse e-mail ne contient pas le signe "@". Veuillez vérifier.')
document.mail_form.zone_email.focus()
return false
}

if (document.mail_form.zone_email.value.indexOf("@",atPos+1) != -1) {	// and only one "@" symbol
alert('Il ne doit y avoir qu\'un signe "@". Veuillez vérifier.')
document.mail_form.zone_email.focus()
return false
}

periodPos = document.mail_form.zone_email.value.indexOf(".",atPos)

if (periodPos == -1) {					// and at least one "." after the "@"
alert('Vous avez oublié le point "." après le signe "@". Veuillez vérifier.')
document.mail_form.zone_email.focus()
return false
}

if (periodPos+3 > document.mail_form.zone_email.value.length)	{		// must be at least 2 characters after the 
alert('Il doit y avoir au moins deux caractères après le signe ".". Veuillez vérifier.')
document.mail_form.zone_email.focus()
return false
}if (document.mail_form.zone_texte.value == "") {
alert("Veuillez laisser un message")
return false
} } // Fin de la fonction

</script></head><body><form name="mail_form" method="post" action="<?=$_SERVER['PHP_SELF']?>" onSubmit="return verifSelection()">
  <div align="center"></div>
<p align="center">
<table width="566" border="0" align="center">
<p align="center">
</p><tr>
      <td><font face="Verdana" size="2">Nom</font></td>
      <td><input name="champ1" type="text"></td>
    </tr><tr>
      <td><font face="Verdana" size="2">Prénom</font></td>
      <td><input name="champ2" type="text"></td>
    </tr><tr>
      <td width><font face="Verdana" size="2">Email</font></td>
      <td width><input name="zone_email" type="text"></td>
    </tr><tr>
      <td valign="top"><font face="Verdana" size="2">Message</font></td>
      <td><textarea name="zone_texte" cols="50" rows="10"></textarea></td>
    </tr><tr>
      <td valign="top"><input name="nbre_champs_texte" type="hidden" id="nbre_champs_texte" value="2">
        <input name="nbre_zones_texte" type="hidden" value="1">
<input name="nbre_zone_email" type="hidden" value="1">
<input name="titre_champ1" type="hidden" value="Nom"><input name="titre_champ2" type="hidden" value="Prénom"><input name="titre_email" type="hidden" value="Email"><input name="titre_zone" type="hidden" value="Message"></td>
      <td><div align="center">
<input type="reset" name="Reset" value="Effacer">          
<input type="submit" name="envoi" value="Envoyer">
        </div></td>
    </tr>
  </table>
  <div align="center"></div>
</form></body></html>

Bonjour,
je viens de rédiger un article pour expliquer comment protéger un formulaire sans utiliser de captcha.

N’hésitez pas à utiliser les commentaires si tu as des questions !

C’est parfait
Merci www.clubic.com…