it-swarm.com.de

Verhindern Sie Php-Webkontaktformular-Spam

Ich bin ein Amateur-Webdesigner, ich habe auf stackoverflow.com und anderen Websites gesucht und viele Korrekturen für dieses Problem gefunden, das ich habe, aber keiner von ihnen hat funktioniert (wahrscheinlich, weil ich sie falsch implementiere). Ich hoffe, jemand mit mehr Wissen kann mir mit einem einfachen Fix helfen oder zeigt mir, wie ich eines der gefundenen Fixes implementieren kann. 

Das Problem: Ich habe ein sehr einfaches PHP-Kontaktformular auf der Website meines Unternehmens. Es hat seit Jahren großartig funktioniert, wurde aber in der letzten Woche gehackt. Ich erhalte jetzt täglich hunderte von Kontaktformulareinreichungen ohne Kommentare. Sie haben nur (anscheinend gültige) E-Mail-Adressen und eine Zeichenfolge im Namensfeld (wie "58ee8b52eef46").

Ich habe verschiedene Techniken ausprobiert, um diesen Spam zu verhindern, und sie brechen entweder meine PHP-Form oder sie verhindern den Spam nicht. Wenn möglich, möchte ich eine Lösung, die KEINEN Captcha-Test für verzerrten Text erfordert und NICHT, dass alle Felder des Formulars ausgefüllt werden müssen.  

Hier ist mein vollständiger PHP Code: 

<?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

Ein einfacher Trick besteht darin, ein Honeypot-Feld zu erstellen:

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

Ein noch einfacherer Ansatz, der für mich funktioniert. Buchstäblich alle Spam-Mails, die ich erhalte (d), enthielten eine URL in der Nachricht. Also filtere ich danach und habe seitdem keine Spam-Nachrichten mehr erhalten. Ich bekam ungefähr 10 pro Woche.

Fügen Sie dies in Ihre Zeile ein $ error_message = ""; in Ihrer PHP-Datei:

if(preg_match('/http|www/i',$comments)) {
    $error_message .= "We do not allow a url in the comment.<br />";
  }

Das/i im preg_match macht die Groß- und Kleinschreibung unabhängig. Das 'http' filtert auch nach 'https'.

1
Joseph K

Erstellen Sie ein Formularfeld und blenden Sie es für die Benutzer aus. Überprüfen Sie im PHP-Skript, ob dieses Feld übermittelt, aber leer ist. Nun wissen Sie, dass die Anfrage von Ihrem Formular und einem Benutzer stammt.

Spam füllt das ausgeblendete Feld oder wenn das PHP-Skript direkt verwendet wird, ist das Spam-Schutzfeld nicht gesetzt.

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;
}

Weitere Methoden zum Schutz eines Php-Formular-Spam finden Sie hier: https://zinoui.com/blog/protect-web-forms-from-spam

1
BenRoe

Wenn der Spam, den Sie erhalten, keinen Kommentar enthält, fügen Sie einfach einen Haken hinzu. Es gibt absolut keinen Grund für einen echten, menschlichen Besucher, das Kontaktformular ohne Kommentar abzugeben.

Da Sie kein Captcha hinzufügen möchten, besteht die einfachste Lösung kurzfristig darin, zu überprüfen, ob der Kommentar eine Mindestanzahl von Zeichen ist und mindestens eine bestimmte Anzahl von Wörtern enthält.

Zum Beispiel:

$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.');
}

Dies ist eine sehr einfache Überprüfung, um zu sehen, dass der Kommentar mindestens 20 Zeichen und mindestens 3 Leerzeichen (4 Wörter) enthält. Nach Bedarf anpassen.

0
rickdenhaan

Verborgene Felder, dumme Fragen (Was ist 3 + 4?) Usw. sind beim Blockieren von Spam auf Formularen nicht sehr effektiv.

Ich habe vor einigen Jahren nachgeforscht und eine Lösung gefunden, die ich "FormSpammerTrap" nenne. Es verwendet JavaScript-Code, um den Fokus/das Klicken auf erforderliche Felder zu überwachen. Automatisierte Prozesse können, sofern sie nicht stark an eine bestimmte Site angepasst werden (was mehr Zeit in Anspruch nimmt, als Spambot-Besitzer dies wünschen), das erforderliche Feld nicht "fokussieren".

Ich habe eine kostenlose Lösung auf meiner www.FormSpammerTrap.com Site. Und dort gibt es eine Form, die Spambots versuchen können, Spam zu senden ... und das haben sie seit mehr als 3 Jahren nicht. Sie können es gerne ausprobieren ... es ist alles Open Source, damit Sie sehen können, wie es funktioniert. (Und wenn Sie das Formular verwenden, sammle ich Ihre E-Mail-Adresse nicht. Ich antworte einmal und lösche dann Ihre E-Mail.)

Meine Technik ist beim Blockieren von Spambots viel effektiver. Sie konnten das Kontaktformular auf dieser Website nicht spambotieren.

0
Rick Hellewell