Bonjour à tous.
J'ai de plus en plus de retour de mail php pollués par des spam.
Mon fournisseur d'accès me demande de mettre un Captcha dans mes formulaires.
Comment puis je le faire, le plus simplement possible ? Avec ou sans php...
Y a t'il une solution miracle ?
Merci pour votre aide
Michel Smiley cligne
Administrateur
Bonjour,

Pour un site sans enjeu, le plus simple est d'ajouter une case à cocher ou champ caché en CSS et/ou attribut hidden avec une étiquette du genre "Ne cochez PAS/ ne remplissez PAS ce champ". Les robots sont pour la plupart assez idiots enfin simplistes pour se faire avoir parce qu'ils n'utilisent pas un navigateur ou ne font pas attention (il y a bien assez d'autres sites où ils sont fonctionnels).
Si champ rempli alors c'est du spam.
Ça ne fonctionnera pas pour MS, Google, Meta, les impôts, Ameli, etc mais nous ne sommes pas ces entreprises ou organismes-là.

Les CAPTCHA sont pour leur immense majorité inaccessibles aux personnes non-voyantes, malvoyantes et plein de monde n'arrive pas à bien cliquer sur les feux rouges, bornes d'incendie, etc
L'alternative audio est inaudible (coucou reCaptcha, sérieux faut essayer pour s'en rendre compte...).
Et les services de Google ne respectent pas la législation européenne autant que je sache.
Bonjour,

Felipe a écrit :
Pour un site sans enjeu, le plus simple est d'ajouter une case à cocher ou champ caché en CSS et/ou attribut hidden avec une étiquette du genre "Ne cochez PAS/ ne remplissez PAS ce champ"


Par exemple ?

<input tabindex="35" type="checkbox" name="obj[]" value="spam" id="spam" /><label for="spam">Ne pas cocher</label>


input[tabindex="35"] {visibility : hidden}


Je préférerais display : none au lieu de visibility : hidden afin de ne pas affecter la mise en page mais je suppose que display : none interdit que la case soit cochée.
Modifié par boteha_2 (28 May 2025 - 15:51)
Administrateur
Il manque un i : visibility (source : le nombre de fois où j'écris accessiblité...). Dans les 2 cas ce sera caché visuellement ET aux utilisateurs de lecteurs d'écran et/ou du clavier donc peu importe. 3 cas avec l'attribut hidden.

Euh pourquoi as-tu un tabindex positif ? Sur un élément caché peu importe, il n'est pour ainsi dire pas là mais en temps normal, aller contre l'ordre naturel de tabulation clavier n'est pas bon signe pour l'accessibilité.
Bonjour à tous,
Après plus de 15 jours, mes spams sur le formulaire du domaine delaplacem.fr ont disparu...
Je n'ai plus qu'à généraliser la méthode sur l'autre domaine Delaplace. fr et ses sous-domaines
Merci pour votre aide
Smiley biggrin
Bonjour,

Felipe a écrit :
Il manque un i : visibility (source : le nombre de fois où j'écris accessiblité...).


Ok, c'est corrigé.

Felipe a écrit :
Euh pourquoi as-tu un tabindex positif ? Sur un élément caché peu importe, il n'est pour ainsi dire pas là mais en temps normal, aller contre l'ordre naturel de tabulation clavier n'est pas bon signe pour l'accessibilité.


C'est un vieux script.
tabindex suit l'ordre naturel mais donc est complétement inutile...
Je vais virer ces tabindex.
Euh, j'ai sans doute fait une connerie... Je n'ai plus de spam, mais plus de messages du tout... Je reviens vers vous d'ici peu... Smiley ohwell
bonjour à tous
Voilà le texte de mon formmail en php...
je suis presque certain que les erreurs de syntaxe dans mon php empêche son fonctionnement...

<?php
header('Location: https://delaplacem.fr/merci.htm');


if($_SERVER['REQUEST_METHOD'] == 'POST')

{// On vérifie que le champ "objet" est vide
if(isset($_POST['objet']) && empty($_POST['objet']))

{// On vérifie que tous les champs sont remplis
if(
isset($_POST['nom']) && !empty($_POST['nom']) &&
isset($_POST['mail']) && !empty($_POST['mail']) &&
isset($_POST['commentaires']) && !empty($_POST['commentaires'])
)
{// On "nettoie" le contenu
$nom = strip_tags($_POST['nom']);
$mail = strip_tags($_POST['mail']);
$commentaires = htmlspecialchars($_POST['commentaires']);

{// Ici vous devrez traiter les données

echo " Message de {$nom} envoyé";

}
}

}else{
http_response_code(405);
echo "Méthode non autorisée";
}

// On vérifie que le visiteur vient du formulaire

if(isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] == "https://delaplacem.fr"){
if($_SERVER['REQUEST_METHOD'] == 'POST'){
// On vérifie que le champ "objet" est vide
if(isset($_POST['objet']) && empty($_POST['objet'])){
// On vérifie que tous les champs sont remplis
if(
isset($_POST['nom']) && !empty($_POST['nom']) &&
isset($_POST['mail']) && !empty($_POST['email']) &&
isset($_POST['commentaires']) && !empty($_POST['commentaires'])
){
// On "nettoie" le contenu
$nom = strip_tags($_POST['nom']);
$email = strip_tags($_POST['mail']);
$message = htmlspecialchars($_POST['commentaires']);

// Ici vous devrez traiter les données

echo " Message de {$nom} envoyé";

}
}

}else{
http_response_code(405);
echo "Méthode non autorisée";
}
}



//inscription dans essai
$fp = fopen ("essai.txt", "a+");
fputs ($fp, $message);
fputs ($fp, $destinataire);
fputs ($fp, $r);

fputs ($fp, $r);
fputs ($fp, $to);
fputs ($fp, $ret);
fclose ($fp);
exit;
?>
Bonjour,

if(isset($_POST['objet']) && empty($_POST['objet']))


Si le champ objet n'est pas rempli isset($_POST['objet']) renvoie FALSE donc l'envoi du message est bloqué.
Il manque un !.

if(!isSet($_POST['objet']))


est suffisant.

ou si la champ objet est text et renvoie un résultat vide :
if(Empty($_POST['objet']))


De manière ,générale si tu emploies Empty tu n'a pas besoin d'employer isSet car isSet est inclus dans Empty, va vérifier dans la doc php.net..

PS : quel est le type du champ objet ?
Modifié par boteha_2 (30 May 2025 - 16:34)
merci Boteha_2, pour ton aide...
le php est un peu de l'hébreu pour moi et me plonger dans ce langage me demanderai un effort dont je ne suis plus capable. Rien que l'apprentissage des opérateurs a du mal à s'imprimer
J'ai modifié quelques lignes et j'ai de manière systématique un message d'erreur au moment où je fais des essais de mon formulaire
voici le php :
_____________
<?php
header('Location: https://delaplacem.fr/merci.htm');


if($_SERVER['REQUEST_METHOD'] == 'POST');{

// On vérifie que le champ "objet" est vide
if(!isset($_POST['objet']));

// On vérifie que tous les champs sont remplis
if(
isset($_POST['nom']) && !empty($_POST['nom']) &&
isset($_POST['mail']) && !empty($_POST['mail']) &&
isset($_POST['commentaires']) && !empty($_POST['commentaires'])
);
// On "nettoie" le contenu
$nom = strip_tags($_POST['nom']);
$mail = strip_tags($_POST['mail']);
$commentaires = htmlspecialchars($_POST['commentaires']);

// Ici vous devrez traiter les données

echo " Message de {$nom} envoyé";


la ligne 26 }else{
http_response_code(405);
echo "Méthode non autorisée"};


// On vérifie que le visiteur vient du formulaire

if(isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] == "https://delaplacem.fr");
if($_SERVER['REQUEST_METHOD'] == 'POST');

// On vérifie que le champ "objet" est vide
if(isset($_POST['objet']) && empty($_POST['objet'])){
// On vérifie que tous les champs sont remplis
if(
isset($_POST['nom']) && !empty($_POST['nom']) &&
isset($_POST['mail']) && !empty($_POST['email']) &&
isset($_POST['commentaires']) && !empty($_POST['commentaires'])
)
// On "nettoie" le contenu
$nom = strip_tags($_POST['nom']);
$email = strip_tags($_POST['mail']);
$message = htmlspecialchars($_POST['commentaires']);{

// Ici vous devrez traiter les données

echo " Message de {$nom} envoyé";

} else{
http_response_code(405);
echo "Méthode non autorisée";
}

------------------------------------------
et le message d'erreur
Erreur d'analyse : erreur de syntaxe, jeton inattendu « else », fin de fichier attendue dans /htdocs/formmail.php à la ligne 26

il s'agit sans doute des opérateurs } et { que j'ai retrouvé dans le manuel et que je supprimerais bien....
Bonjour,

if(
isset($_POST['nom']) && !empty($_POST['nom']) &&
isset($_POST['mail']) && !empty($_POST['mail']) &&
isset($_POST['commentaires']) && !empty($_POST['commentaires'])
);


Enlève le ; à la fin et remplace-le par {

Cela fera une erreur fatale en moins mais j'ai peur qu'il en reste d'autres.

Par ailleurs, cela ,ne provoque pas d'erreur mais comme déjà dit il est redondant d'employer isSet avec Empty.

if (!empty ($_POST['nom']) && !empty ($_POST['mail']) && !empty ($_POST['commentaires']))
{


Essaye cela à la place du code ci-dessus.
bonjour à tous, et merci pour votre aide....
trop de manipulations, mélange des !empty et empty dans les test
syntaxe des if go to et else inadéquate
Je préfère revenir à ma version "sans pot de miel" en attendant une solution acceptable

<?php
header('Location: https://delaplacem.fr/merci.htm');

$nom = $_POST['Nom'];
$mail = $_POST['Mail'];
$objet = $_POST['objet'];
$commentaires= $_POST['commentaires'];
$to = 'michel@delaplacem.fr';
$ret="\n\r";
$r= "\n";
$subject = 'Formulaire';
if(empty($nom))
echo "remplir le champ nom";

if(empty($mail))
echo " merci de completer le champ adresse mail";

//ok pas vide //on convertit les caractètres HTML du commentaire
$commentaires = htmlentities($commentaires);

//mise en forme du message
$message = " Nom : $nom\n Mail : $mail\n \n commentaires : $commentaires ";


// Envoi du mail

if(mail($to, $subject, $message)) {

echo "Les informations ont bien été envoyées";


} else {

echo "Une erreur est survenue lors de l'envoi";

}


//inscription dans essai
$fp = fopen ("essai.txt", "a+");
fputs ($fp, $message);
fputs ($fp, $destinataire);
fputs ($fp, $r);
fputs ($fp, $subject);
fputs ($fp, $r);
fputs ($fp, $to);
fputs ($fp, $ret);
fclose ($fp);
exit;
?>
Bonjour,

Avec le pot de miel tu peux faire :

// Envoi du mail

if (empty ($objet))
{
if(mail($to, $subject, $message))
  {

echo "Les informations ont bien été envoyées";


  }
else
  {

echo "Une erreur est survenue lors de l'envoi";

  }
}


Les mails des robots ne partiront pas mais tu les verras dans ton journal.
merci boteha_2

j'ai mis en place cette dernière solution plus simple et vérifié le fonctionnement et l'enregistrement dans le journal...
il n'y a plus qu'a attendre quelques jours...
Smiley biggrin
Ok.

Je suppose que tu n'as pas oublié de créer un champ caché "objet" dans le HTML

Personnellement je viens de le faire sur un formulaire de mail piraté de temps en temps.

Je vérifie aussi l'existence d'un REFERER mais cela ne sert pas à grand chose.

Je récupère l'adresse IP de tout mail reçu.
Quand ce sont des spams je bloque cette adresse.

$spam = array ('46.161.9.48', '5.188.211.13', etc...);
if (in_array ($_SERVER['REMOTE_ADDR'], $spam)) Exit ();


Il me semble que le plus efficace est de repérer les répétitions de contenu et/ou de provenance.
C'est un peu plus compliqué à faire.
Merci pour ta réponse
voilà le lien vers le formulaire en place
https://delaplacem.fr/formulaire.htm

le sujet qui est la variable objet ne peut être complété
voilà son code
<input name="objet" type="text" size="48">
<td height="66" bgcolor="#0000FF" width="415"><b>
<font color="#660000">&nbsp;</font><font color="#FFFFFF" size="4">sujet:</font></b></td>
<td height="66" bgcolor="#0000FF" width="415" bordercolor="#C0C0C0">

si tu peux le compléter , je verrai ce qui se passe ...
Hello,

Remplace le paquet avec en plus le <tr> avant et </tr> après par :

<tr id="robot"><td colspan="2"><input name="objet" type="checkbox" value="rob" /></td></tr>


Et dans ta feuille de style :

tr#robot {display: none}


Sous contrôle de gcyrillus...
Modifié par boteha_2 (01 Jun 2025 - 17:51)