web-dev-qa-db-fra.com

Empêcher le spam par formulaire de contact Web php

Je suis un concepteur de sites Web amateur. J'ai effectué des recherches sur stackoverflow.com et d'autres sites Web et j'ai trouvé de nombreuses solutions à ce problème, mais aucune d'entre elles n'a fonctionné (probablement parce que je ne les ai pas correctement implémentées). J'espère qu'une personne plus informée pourra m'aider avec un correctif simple ou me montrer comment mettre en œuvre l'un des correctifs que j'ai trouvés. 

Le problème: j'ai un formulaire de contact php très simple sur le site web de mon entreprise. Cela a bien fonctionné pendant des années, mais la semaine dernière a été piraté. Je reçois maintenant des centaines de soumissions de formulaire de contact par jour, sans commentaires. Elles ne possèdent que des adresses électroniques (apparemment valides) et une chaîne de caractères dans le champ du nom (comme "58ee8b52eef46").

J'ai essayé plusieurs techniques pour empêcher ce spam, et elles cèdent à ma forme php ou n'empêchent pas le spam. Si possible, j'aimerais une solution qui n'exige PAS un test de texte déformé Captcha, et qui n'exige PAS que tous les champs du formulaire soient remplis.  

Voici mon code complet PHP: 

<?php
if(isset($_POST['email'])) {
$email_to = "[email protected]";
$email_subject = "website form submission";

function died($error) {
    echo "We are very sorry, but there were error(s) found with the form you submitted. ";
    echo "These errors appear below.<br /><br />";
    echo $error."<br /><br />";
    echo "Please go back and fix these errors.<br /><br />";
    die();
}

if(!isset($_POST['name']) ||
    !isset($_POST['email']) ||
    !isset($_POST['telephone']) ||
    !isset($_POST['comments'])) {
    died('We are sorry, but there appears to be a problem with the form you submitted.');       
}

$name = $_POST['name'];
$email_from = $_POST['email'];
$telephone = $_POST['telephone'];
$comments = $_POST['comments'];

$error_message = "";
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.\n\n";

function clean_string($string) {
  $bad = array("content-type","bcc:","to:","cc:","href");
  return str_replace($bad,"",$string);
}

$email_message .= "Name: ".clean_string($name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Telephone: ".clean_string($telephone)."\n";
$email_message .= "Comments: ".clean_string($comments)."\n";

$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);  
?>

Thank you for contacting us. We will be in touch with you soon. You will now be redirected back to example.com.
<META http-equiv="refresh" content="2;URL=http://www.example.com">


<?php
}
die();
?>
4
user7858610

Une astuce simple consiste à créer un champ pot de miel:

html

<!-- within your existing form add this field -->
<input type="text" id="website" name="website"/>

css 

/*in your css hide the field so real users cant fill it in*/
form #website{ display:none; }

php 

//in your php ignore any submissions that inlcude this field
if(!empty($_POST['website'])) die();
17
Steve

Créez un champ de formulaire et masquez-le pour les utilisateurs . Dans le script php, vérifiez si ce champ est soumis, mais vide . Vous savez maintenant que la demande provient de votre formulaire et d'un utilisateur.

Le spam remplira le champ masqué ou, s’ils utilisent votre script php, le champ de protection anti-spam n’est pas défini.

HTML

<input name="website" type="text" class="website"/>

CSS

form .website{ display:none; } /* hide because is spam protection */

PHP

# spam protection
if (isset($_POST["website"]) && $_POST["website"] == "") {
  # your php code to mail here
} else {
  http_response_code(400);
  exit;
}

Vous pouvez trouver plus de méthodes pour protéger un spam php ici: https://zinoui.com/blog/protect-web-forms-from-spam

1
BenRoe

Si le spam que vous recevez n'a pas de commentaire, pourquoi ne pas simplement ajouter un chèque pour cela? Il n'y a absolument aucune raison pour un vrai visiteur humain de soumettre votre formulaire de contact sans commentaire.

Puisque vous ne voulez pas ajouter de captcha, la solution la plus simple à court terme serait de vérifier que le commentaire contient un nombre minimum de caractères et qu'il contient au moins un certain nombre de mots.

Par exemple:

$comments = trim($_POST['comments']); // trim() to strip off whitespace from beginning and end, like spaces and linebreaks

if (strlen($comments) < 20 || substr_count($comments, " ") < 3) {
    died('Your comment is too short.');
}

Il s’agit d’une vérification très simple pour vérifier que le commentaire contient au moins 20 caractères et au moins 3 espaces (4 mots). Tweak au besoin.

0
rickdenhaan

Les champs cachés, les questions idiotes (qu'est-ce que 3 + 4?), Etc., ne sont pas très efficaces pour bloquer le spam sur les formulaires.

J'ai étudié cela il y a plusieurs années et j'ai mis au point une solution que j'appelle "FormSpammerTrap". Il utilise du code JavaScript pour "surveiller" le focus/cliquer sur les champs obligatoires. Les processus automatisés, à moins d'être hautement personnalisés pour un site spécifique (ce qui prend plus de temps que les propriétaires de spambots ne veulent prendre), ne peuvent pas «cibler/cliquer» sur un champ obligatoire.

J'ai une solution gratuite sur mon www.FormSpammerTrap.com site. Et il y a une forme là-bas que les spambots peuvent essayer de spammer ... et ils ne l'ont pas, depuis plus de 3 ans. Vous êtes invités à l'essayer ... tout est open source, vous pouvez donc voir comment cela fonctionne. (Et, si vous utilisez le formulaire, je ne récolte pas votre courrier électronique. Je réponds une fois, puis supprimez votre courrier électronique.)

Ma technique est beaucoup plus efficace pour bloquer les spambots. Ils n'ont pas pu spamboter le formulaire de contact sur ce site.

0
Rick Hellewell