Verhindern Sie Spam über PHP-Web-Kontaktformulare

Lesezeit: 12 Minuten

Benutzer-Avatar
Benutzer7858610

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 keine davon hat funktioniert (wahrscheinlich, weil ich sie falsch implementiert habe). Ich hoffe, jemand mit mehr Wissen kann mir mit einer einfachen Lösung helfen oder mir zeigen, wie ich eine der von mir gefundenen Lösungen implementieren kann.

Das Problem: Ich habe ein sehr einfaches PHP-Kontaktformular auf der Website meines Unternehmens. Es hat jahrelang super funktioniert, wurde aber in der letzten Woche gehackt. Ich erhalte jetzt jeden Tag Hunderte von Kontaktformulareinsendungen ohne Kommentare, sie haben nur (scheinbar gültige) E-Mail-Adressen und eine Zeichenfolge im Namensfeld (wie “58ee8b52eef46”).

Ich habe verschiedene Techniken ausprobiert, um diesen Spam zu verhindern, und entweder brechen sie mein PHP-Formular, 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 erfordert, dass alle Felder des Formulars ausgefüllt werden.

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();
?>

  • Hast Du Dir angesehen captcha

    – RiggsFolly

    12. April 2017 um 20:33 Uhr

  • Ich habe das sicher schon einmal erwähnt, aber Google Recaptcha ist jetzt für die meisten legitimen Besucher unsichtbar.

    – Steve

    12. April 2017 um 20:36 Uhr

  • Ich habe überlegt, Captcha zu verwenden. Aber ich würde eine Lösung bevorzugen, die kein Captcha verwendet, um ein sauberes Aussehen auf meiner Website zu behalten.

    – Benutzer7858610

    12. April 2017 um 20:37 Uhr

  • Niemand sollte jemals reCaptcha verwenden. Es ist unethisch, denn um es zu verwenden, müssen Sie Ihre Website absichtlich mit Spyware infizieren, die auf Ihre Benutzer abzielt. Jeder, der dem Tracking nicht zustimmt (z. B. durch Blockieren von Drittanbieter-Skripten von Google), wird daran gehindert, einen durch reCaptcha „geschützten“ Teil Ihrer Website zu verwenden.

    – Skylar Ittner

    12. Juli 2019 um 4:32 Uhr


  • Zu oft musste ich über ein Dutzend Klicks machen, um an einem Captcha vorbeizukommen, da sie jetzt einige Bilder durch neue ersetzen. Echte PITA. Bitte vermeiden Sie deren Verwendung!

    – Patanjali

    1. Juli 2021 um 20:48 Uhr

Benutzer-Avatar
Steve

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();

  • Ja, website ist eine gute allgemeine Wahl, da die meisten dummen Spambots versuchen, einen Link zu löschen. Sie können beliebig viele Honeypot-Felder hinzufügen. Sie könnten sogar einen Honeypot namens hinzufügen emailund benennen Sie Ihr echtes E-Mail-Feld in etwas anderes um (z emailaddress).

    – Steve

    12. April 2017 um 21:33 Uhr

  • @vega ändern von isset zu !empty Das war ein Fehler in meiner Antwort – leere Formularfelder werden als leere Zeichenfolgen übermittelt und werden daher immer festgelegt

    – Steve

    26. Juli 2017 um 11:55 Uhr

  • Dieser Beitrag ist 2 Jahre alt und scheint nichts mehr zu tun. Ich habe dies auf einigen Websites ausprobiert und die Bots scheinen diese Technik zu berücksichtigen.

    – bolvo

    3. Juni 2019 um 13:00 Uhr


  • Hatte das Problem, dass der Browser einen oder mehrere meiner Honeypots automatisch vervollständigte. Die Behebung bestand darin, jedem Honeypot-Element das Attribut “autocomplete=’off'” hinzuzufügen.

    – ReverseEMF

    15. Juni 2019 um 15:20 Uhr


  • Wenn der Bot für eine bestimmte Website entwickelt wurde, würde er nicht in diese Falle tappen

    – Abhishek Choudhary

    7. Juni 2020 um 7:05 Uhr

Ein noch einfacherer Ansatz, der für mich funktioniert. Buchstäblich jeder Spam, den ich erhalte, hatte eine URL in der Nachricht. Also filtere ich danach und habe seitdem keine Spam-Nachrichten mehr erhalten. Früher bekam ich etwa 10 pro Woche.

Fügen Sie dies unter Ihrer Zeile hinzu $error_message = “”; in deiner php-datei:

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

Das /i in preg_match macht es unabhängig von der Groß-/Kleinschreibung. Das „http“ filtert auch nach „https“.

  • Ich habe dies auf einer Website verwendet, die viel Spam von Bots erhält, und es funktioniert! Wie würden Sie eine zweite Eingabe hinzufügen, z. B. Adresse? Ich habe es unten versucht und beides hat nicht funktioniert. if(preg_match(‘/http|www/i’,$company)) { und if(preg_match(‘/http|www/i’,$message)) { if(preg_match(‘/http|www/i’, $Nachricht, $Firma)) {echo

    – SteuerungZ

    17. Juli 2020 um 21:05 Uhr

  • Ach, genial!

    – AymDev

    18. September 2020 um 16:11 Uhr

  • Außer dass Sie manchmal eine URL in der Nachricht enthalten müssen. Meine FormSpammerTrap-Lösung (jetzt in Version 10, bald Version 11) ermöglicht mehrere URLs sowie viele andere Anpassungen des Formulars. Sehr effektive Techniken, die im Code verwendet werden – meine Seiten erhalten keinen Spam.

    – Rick Hellwell

    20. März 2021 um 19:20 Uhr

Versteckte Felder, dumme Fragen (was ist 3+4?) usw. sind nicht sehr effektiv beim Blockieren von Spam auf Formularen.

Ich habe dies vor einigen Jahren recherchiert und eine Lösung gefunden, die ich “FormSpammerTrap” nenne. Es verwendet JavaScript-Code, um den Fokus/Onclick auf erforderliche Felder zu „beobachten“. Automatisierte Prozesse können ein erforderliches Feld nicht „fokussieren/anklicken“, es sei denn, sie sind stark auf eine bestimmte Website zugeschnitten (was mehr Zeit in Anspruch nimmt, als Spambot-Eigentümer in Anspruch nehmen möchten).

Ich habe eine kostenlose Lösung bei mir www.FormSpammerTrap.com Seite? ˅. Und es gibt dort ein Formular, das Spambots versuchen können zu spammen … und das haben sie seit mehr als 3 Jahren nicht getan. 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, lese ich Ihre E-Mail nicht. Ich antworte einmal und lösche dann Ihre E-Mail.)

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

  • Ich bin mir nicht sicher, warum die Ablehnung: **Hinzugefügt am 12. Juli 2018 ** Der Trick besteht darin, ein On-Click/On-Focus-Ereignis hinzuzufügen, das den Aktionsparameter auf die eigentliche Verarbeitungsseite ändert. Ansonsten ist der Standardwert, den ich verwende, eine Site vom Typ Honeytrap. Ich denke, es ist für einen Spammer schwierig, diese Ereignisse zu simulieren, obwohl es vielleicht möglich ist. Die Technik blockiert viele Bot-Spammer. Und immer noch, nach ein paar Jahren mit der Technik auf dieser Seite, wurde das Formular nicht von Bots gespammt. (Ich definiere einen Bot-Spammer, der mehrere Übermittlungen über den Angriff sendet, nicht nur eine Übermittlung.) Funktioniert für mich.

    – Rick Hellwell

    13. Juli 2018 um 0:22 Uhr

  • Ist Ihr System mit legitimen Formularausfüllern wie 1Password kompatibel?

    – Stefan R

    13. Juli 2018 um 23:15 Uhr


  • Sollte sein, obwohl ich es nie probiert habe. Es hat nur etwas Javascript, um Dinge mit einem On-Click- und On-Focus-Event zu ändern. Da Spam-Bots Javascript nicht (leicht) ausführen können, blockiert dies viele von ihnen. Sie können dem Formular ganz einfach reCaptcha hinzufügen, wenn Sie möchten. Nichts Besonderes daran, nur in die Formulare implementiert, also müssen Sie nur ein paar Variablen ändern, eine Datei einfügen und die Funktion aufrufen, die das Formular “erstellt”. Es ist kostenlos auszuprobieren und zu verwenden; voll ausgestattet. Weitere Informationen finden Sie auf der Website.

    – Rick Hellwell

    14. Juli 2018 um 1:25 Uhr

  • Formularausfüller arbeiten mit FormSpammerTrap (FST). Und viele Anpassungen sind verfügbar, um ein Formular mit allen Arten von Feldern zu erstellen. Bot-Schutz ist ausgezeichnet; Ich habe mit meiner Lösung noch nie automatisierten Spam erhalten. Version 11 wird in Kürze veröffentlicht. Alle Details auf der FST Seite.

    – Rick Hellwell

    20. März 2021 um 19:21 Uhr

  • Jetzt bis Version 14; arbeitet an Version 15. V14 hat unzählige neue Funktionen (Sprachen und mehr) und es gibt unzählige anpassbare Funktionen. Sie können FST-Spamblocker zu jedem Formular hinzufügen. Noch alles frei. Siehe v14 in Verwendung auf meiner FormSpammerTrap-Site (Link oben). Gibt es seit 2011 – immer noch die beste Lösung, IMHO.

    – Rick Hellwell

    26. Mai um 21:46 Uhr

Normalerweise senden die Bots ein Formular sehr schnell ab. Auf dieser Grundlage könnte eine andere Lösung darin bestehen, ein weiteres verstecktes Feld hinzuzufügen, das die Anzahl der Sekunden enthält, die seit dem Öffnen der Seite vergangen sind. Dies kann mit JavaScript erfolgen. Dann überprüfen Sie es in PHP. Wenn die Anzahl der Sekunden kleiner als 5 Sekunden ist, handelt es sich um Spam (es ist wahrscheinlicher, dass der echte Client mehr Zeit benötigt, um das Formular anzupassen). Sie können die Anzahl der Sekunden basierend darauf anpassen, wie viele Felder das Formular enthält.

Benutzer-Avatar
BenRoe

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

Spam füllt das verborgene Feld, oder wenn sie Ihr PHP-Skript direkt verwenden, ist das Spamschutzfeld 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-Formulars vor Spam finden Sie hier: https://zinoui.com/blog/protect-web-forms-from-spam

  • Für einen robusten Spam-Bot ist es sehr einfach, versteckte Felder zu finden und zu übermitteln. Und diese Bots können hochgradig automatisiert sein, um Formulare zu finden und auszunutzen.

    – Rick Hellwell

    20. März 2021 um 19:22 Uhr

Benutzer-Avatar
KrondaliX

Für meine Antwort, da ich damit fertig bin, werde ich einfach einige neue Möglichkeiten hinzufügen, weil der Honeypot von Steve extrem gut ist, aber entführt wurde (vielleicht neue Software für Spamming heutzutage) und das handgemachte Captcha wie (was 3 + 4 ist) nicht funktioniert bei mir auch mit Zufallszahlen, es hat eine Weile funktioniert, aber nach einiger Zeit nicht mehr funktioniert. Ich weiß nicht, wie sie daran vorbeigekommen sind, aber ich musste einige Codes hinzufügen …

Also habe ich es geschafft, die IP des Spammers wie folgt zu bekommen:

$ip = $_SERVER['REMOTE_ADDR'];

Dann fügte ich $ip zu der gesendeten E-Mail durch meinen PHP-Code im Betreff hinzu und fügte dann diesen Code hinzu, um die Ergebnisse zu überprüfen, ohne meinen Posteingang zu spammen:

if ($ip == '1.1.1.1') /*<-- this is an example*/
{
 $fp = fopen('spam_log.txt', 'a');
 fwrite($fp, 'Inputname: '.$inputname.' IP: '.$ip."\n");
 fclose($fp); die;
}

Damit war ich für eine Weile auf der sicheren Seite, da sich die IP des Spammers nicht sehr oft änderte.

Was ich am meisten bekam, waren URLs, also fügte ich Folgendes hinzu:

if (strstr($inputname, 'http')){die;} /*<-- did that for each input i had*/
if (strstr($inputname, 'www')){die;} /*<-- did that for each input i had*/

Aber manchmal habe ich Spam ohne URLs erhalten … zufällig habe ich im Wesentlichen kyrillische Spam-E-Mails erhalten, also habe ich diesen Code verwendet:

$inputname_cyrillic = (bool) preg_match('/[\p{Cyrillic}]/u', $inputname);
if ($inputname_cyrillic){die;}

Sie können bei Bedarf auch Arabisch oder Griechisch hinzufügen, was gut funktioniert, da ich diese Sprachen nicht lesen kann und mich nicht dafür interessiere.

Wenn Sie Russe, Arabischer oder Grieche sind, können Sie das Gegenteil tun und einfach den Code {Common} hinzufügen, der sich auf AZ bezieht, wenn Sie nur kyrillische oder arabische oder griechische Zeichen empfangen möchten.

Dieser Thread hat mir sehr geholfen, also wollte ich meine Erfahrung einbringen.

  • Für einen robusten Spam-Bot ist es sehr einfach, versteckte Felder zu finden und zu übermitteln. Und diese Bots können hochgradig automatisiert sein, um Formulare zu finden und auszunutzen.

    – Rick Hellwell

    20. März 2021 um 19:22 Uhr

Benutzer-Avatar
rickdenhaan

Wenn der Spam, den Sie erhalten, keinen Kommentar enthält, warum nicht einfach ein Häkchen dafür hinzufügen? Es gibt absolut keinen Grund für einen echten, menschlichen Besucher, Ihr Kontaktformular kommentarlos abzusenden.

Da Sie kein Captcha hinzufügen möchten, wäre die einfachste Lösung kurzfristig zu prüfen, ob der Kommentar eine Mindestanzahl von Zeichen hat 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, ob der Kommentar mindestens 20 Zeichen und mindestens 3 Leerzeichen (4 Wörter) enthält. Passen Sie nach Bedarf an.

  • Hallo, danke für diese Antwort. Ich habe einen anderen Fix implementiert, der Ihrem ähnlich ist. Gelegentlich erhalten wir jedoch eine Formulareinsendung von jemandem, der einfach mehr Informationen wissen möchte und nur eine E-Mail-Adresse oder Telefonnummer ohne Kommentare enthält. Wir haben solche Leads tatsächlich in Verkäufe umgewandelt, daher möchte ich die Möglichkeit, Formulare ohne Kommentare zu erhalten, nicht ausschließen. Ich hoffe das ergibt Sinn.

    – Benutzer7858610

    12. April 2017 um 20:44 Uhr

  • Macht Sinn, aber das öffnet wirklich die Tür für Spam-Bots. In diesem Fall sollten Sie erwägen, ein Kontrollkästchen “Senden Sie mir nur Informationen” hinzuzufügen und die Schaltfläche “Senden” standardmäßig zu deaktivieren (damit die Bots das Formular nicht senden können) und sie dann mit Javascript zu aktivieren, wenn der Kommentar eingegeben wurde oder der Benutzer aktiviert dieses Kontrollkästchen.

    – Rickdenhan

    12. April 2017 um 20:54 Uhr

  • Ich bin mir nicht sicher, ob das Deaktivieren des Senden-Buttons mit Spambots funktioniert, die automatisierte Techniken (wie CURL) verwenden. Ihre Techniken werden in der Lage sein, ein verstecktes Feld zu „sehen“ – sogar einen versteckten Submit-Button – und das Formular abzusenden.

    – Rick Hellwell

    25. April 2018 um 2:23 Uhr

1256970cookie-checkVerhindern Sie Spam über PHP-Web-Kontaktformulare

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy