OW Debug - Notice
Message: Trying to access array offset on value of type null
File: /home/romarekl/public_html/sosyallift.com/ow_plugins/forum/controllers/topic.php
Line: 136
Form Spam-freie zugängliche Formulare Forum | Sosyallift©
Loading...
 
tr
Konu yeri: Forum » General » General Chat
Bilişim ve Teknoloji
Bilişim ve Teknoloji Ocak 21 '18
Spam-freie zugängliche Formulare

In letzter Zeit gab es viele Diskussionen darüber, wie verhindert werden kann, dass Spambots Formulare auf Websites einreichen. Viele Lösungen wurden vorgestellt, von denen viele die Benutzerfreundlichkeit und Zugänglichkeit der Webseite beeinflussen. CAPTCHA ist ein klassischer Fall, bei dem Benutzer und Erreichbarkeit direkt betroffen sind.

Im Laufe des letzten Jahres habe ich die folgenden grundlegenden Techniken zum Blockieren der Spam-Übermittlung in Webformularen zusammengestellt. Ich habe nur ein paar davon implementiert und durch Protokollierung festgestellt, dass sie etwa 99% der Spambot-Einreichungen effektiv reduziert haben, während sie keinen oder nur einen geringen Einfluss auf die Benutzerfreundlichkeit oder die Zugänglichkeit der Formulare haben. Fast alle diese Techniken werden serverseitig unter Verwendung von PHP ausgeführt und der relevante PHP-Code ist unten gezeigt. Die Tests können jedoch leicht in nahezu jeder serverseitigen Skriptsprache implementiert werden.

Haftungsausschluss 1: Diese Spam-Präventionstechniken funktionieren möglicherweise nicht für Anwendungen auf Unternehmensebene, bei denen Spammer gezielt auf Formulare abzielen. Sie sind für generische Kontakt-, Kommentar- oder Registrierungsformulare gedacht, bei denen sich ein Spammer weniger Zeit nimmt, um Ihre spezifischen Spam-Abwehrmechanismen zu umgehen.

Disclaimer 2: Diese Techniken stoppen vor allem Bots und automatisierte Spam-Programme. Sie können auch bestimmte Inhalte filtern. Sie werden jedoch wahrscheinlich nicht verhindern, dass ein wirklich engagierter Mensch Spam auf Ihrer Website veröffentlicht.

Die Techniken sind:

  • Erkennen von Spam-ähnlichen Inhalten in übermittelten Formularelementen
  • Ermitteln Sie Inhalt in einem ausgeblendeten Formularelement
  • Validieren Sie die übergebenen Formularwerte
  • Suchen Sie in mehreren Formularelementen nach dem gleichen Inhalt
  • Generieren Sie dynamischen Inhalt, um sicherzustellen, dass das Formular innerhalb eines bestimmten Zeitfensters oder von demselben Benutzer gesendet wird
  • Erstellen Sie eine mehrstufige Formular- oder Formularprüfungsseite
  • Stellen Sie sicher, dass das Formular von Ihrem Server bereitgestellt wird
Erkennen von Spam-ähnlichen Inhalten in übermittelten Formularelementen

Diese Technik ist wahrscheinlich die stärkste Technik zur Verhinderung von Spam. Die meisten Spam-Bots bestehen entweder darin, URLs von Websites zu posten, um den Datenverkehr zu erhöhen oder das Suchmaschinen-Ranking zu erhöhen, oder sie versuchen, Ihr Formular zu entführen, um Spam-Nachrichten an Sie oder andere zu senden. Wenn Sie häufig verwendete Spam-Inhalte oder E-Mail-Header-Injektionen erkennen, werden fast alle Spam-Bots gestoppt.

Der folgende PHP-Code wird, wenn er auf Ihrer Formularverarbeitungsseite (dem Ort, an den das Formular gesendet wird) platziert, alle Formularelemente nach den häufigsten Header-Injections und anderem Code durchsuchen, der Ihren Mail-Prozessor dazu bringen könnte, eine Kopie zu senden Blindkopie Nachrichten an andere. Es erkennt auch jeden Inhalt, der die Zeichenfolge "[url" enthält, die von den meisten Forum-Software verwendet wird, um Links anzugeben. Wenn solche gefunden werden, wird die $ spam-Variable auf "true" gesetzt.

if (preg_match( "/bcc:|cc:|multipart|\[url|Content-Type:/i", implode($_POST))) { $spam=true; }

Hinweis: Internet Explorer 6 weist einen Fehler auf, der nicht ordnungsgemäß Überlauf von vorformatiertem Text ermöglicht. Wenn Sie diesen Browser immer noch verwenden, müssen Sie die PHP-Codezeilen von dieser Seite neu einbetten.

Sie können auch Links und URLs in den Formularelementen erkennen. Im Folgenden wird die $ spam-Variable festgelegt, wenn mehr als 3 Instanzen von "<a" oder "http:" an einer beliebigen Stelle im Formular angezeigt werden.

if (preg_match_all("/<a|http:/i", implode($_POST), $out) > 3) { $spam=true; }

Dies wird die meisten Spambots zunichte machen, da sie sich hauptsächlich auf das Posten von Links oder das Entführen Ihres Mail-Skripts konzentrieren. Darüber hinaus kann eine sehr einfache Wortfilterung oft Spam auffangen, der sich durchsetzt.

$spamwords = "/(list|of|naughty|spam|words|here)/i"; if (preg_match($spamwords, implode($_POST))) { $spam=true; }

Sie können auch externe Spam-Erkennungsdienste mit aktuellen Mustern von Spam-Inhalten verwenden. Mein Favorit ist Akismet . Akismet wird häufig zum Filtern von Spam in Blog-Kommentaren verwendet (es hat in den letzten 9 Monaten fast 14.000 Spam-Kommentare zu diesem Blog blockiert!), Aber es kann erfolgreich für fast jedes Webformular verwendet werden.

Ermitteln Sie Inhalt in einem ausgeblendeten Formularelement

Die meisten Spambots finden Ihr Formular, bestimmen, wie die Formularelementnamen lauten und suchen die URL, an die das Formular gesendet wird. Die Software wird dann diese Formularelemente mit geänderten, mit Spam gefüllten Werten zurück an die URL für die Formularübermittlung senden. In der Regel füllt der Bot jedes Formularelement mit einem bestimmten Wert, um sicherzustellen, dass es erfolgreich gepostet wird. Wenn Sie also ein Standard-Texteingabeelement in Ihr Formular einfügen, es aber visuell vor dem Benutzer verbergen, so dass der Benutzer nichts in dieses Feld eingeben kann, wird der Spambot wahrscheinlich noch einen Wert für dieses Formularelement veröffentlichen. Wenn Sie feststellen, dass das Formularelement mit einem Wert übergeben wurde, handelt es sich mit ziemlicher Sicherheit um einen Spambot.

Zum Beispiel kann Ihr Formularelement als eingefügt werden

<span style="display:none;visibility:hidden;"> <label for="email">Ignoriere dieses Textfeld. Es wird verwendet, um Spammer zu erkennen. Wenn Sie etwas in dieses Textfeld eingeben, wird Ihre Nachricht nicht gesendet. </label> <input type="text" name="email" size="1" value="" /> </span>

Beachten Sie, dass CSS verwendet wird, um die Texteingabe und ihre Beschriftung vor der Ansicht zu verbergen. Dieser Code wird diesen Inhalt auch vor modernen Bildschirmlesern verbergen. Wenn CSS jedoch deaktiviert ist, wird die Eingabe weiterhin angezeigt. Aus diesem Grund wird ein erklärendes Etikett zur Verfügung gestellt, das den Benutzer informiert, nichts in das Textfeld einzugeben. Ich gab dem Input auch einen schönen, verlockenden Elementnamen von "email" - das ist fast sicher, dass die Spambots einen Wert eingeben.

Sie erkennen dann einfach, ob das Formularelement leer ist. Wenn dies nicht der Fall ist, handelt es sich entweder um einen Spambot oder um einen Benutzer, der CSS deaktiviert hat und den Anweisungen des Labels nicht gefolgt ist.

if(!empty($_POST['email'])) $spam=true;

Diese Taktik, wie alle hier aufgeführten, sollte dennoch eine nützliche, informative Fehlermeldung darstellen, falls der Benutzer Ihr Spam-Erkennungs-Flag irgendwie auslöst.

Validieren Sie die übergebenen Formularwerte

Dies ist vielleicht ohne Erwähnung, aber wenn Sie bestimmte Formularelemente benötigen, stellen Sie sicher, dass Sie ein serverseitiges Skript verwenden, um festzustellen, ob Informationen in diese Formularfelder eingegeben wurden. Wenn Sie Formularinformationen in einem bestimmten Format benötigen (z. B. eine gültige E-Mail-Adresse benötigen), validieren Sie sie. Viele Bots reichen einfach leere Informationen für Felder ein, die sie nicht erkennen, oder senden zufällige Informationen für bestimmte Formularfelder. Ihre Standardformvalidierungsmechanismen können viele Spambots stoppen.

// Wenn die Nachricht leer ist, wirf einen Fehler if(empty($_POST['message'])) $error=true; // if e-mail is not formatted correctly, show error message if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $_POST['email']))) { echo "Please enter a valid email address."; }

Suchen Sie in mehreren Formularelementen nach dem gleichen Inhalt

Einige Spambots geben den gleichen Text in alle nicht erkannten Formularfelder ein. Wenn Sie zwei Formularfelder haben, die niemals die gleichen Informationen enthalten sollten, können Sie erkennen, ob ihre Werte tatsächlich gleich sind. Ist dies der Fall, können Sie einen Fehler melden. In unserem Forumsanmeldungsformularhabe ich festgestellt, dass es einfach einen Fehler gab, wenn der Vor- und Nachname bei Botanmeldungen um 80% reduziert wurde. Es ist keine perfekte Technik und Sie sollten sicherstellen, dass die Felder, die Sie analysieren, immer eindeutig sein sollten (ich schätze, es gibt immer noch eine Chance, dass eine Person den gleichen Vor- und Nachnamen haben könnte, nicht wahr?).

if($_POST['firstname'] == $_POST['lastname']) $spam=true; Generieren Sie dynamischen Inhalt, um sicherzustellen, dass das Formular innerhalb eines bestimmten Zeitfensters oder von demselben Benutzer gesendet wird

Durch das Generieren eindeutiger Formularelemente oder das Erstellen von Sitzungsvariablen können Sie sicherstellen, dass die Person, die Ihre Formularseite besucht, dieselbe Person ist, die das Formular übermittelt. Wenn Sie beispielsweise auf ein Formular zugreifen, können Sie mithilfe von Server-Scripting die aktuelle Uhrzeit in ein ausgeblendetes Formularelement schreiben. Wenn das Formular gesendet wird, können Sie den Wert des ausgeblendeten Formulars mit der aktuellen Uhrzeit vergleichen und sicherstellen, dass nicht mehr als etwa eine Stunde verstrichen ist. Die Wahrscheinlichkeit, dass ein Spambot den korrekten Wert für den Zeitformwert erzeugt, ist sehr unwahrscheinlich. Sie können auch Browser-Cookies festlegen oder andere Client-Sitzungssysteme verwenden, um sicherzustellen, dass eine Benutzersitzung zwischen der Formularseite und der Übermittlungsseite eingerichtet und verwaltet wird.

Im Folgenden wird die aktuelle Uhrzeit im UNIX-Zeitformat in eine versteckte Formulareingabe geschrieben.

<input type="text" name="formtime" value="<?php echo time(); ?>" />

Wenn das Formular gesendet wird, können Sie die Differenz zwischen der aktuellen Uhrzeit und dem im Formular gespeicherten Wert messen. Wenn der Zeitunterschied größer als ein bestimmter Wert ist, können Sie ihn als Spam kennzeichnen. Wenn in diesem Beispiel mehr als eine Stunde (3600 Sekunden) zwischen der Anzeige des Formulars und dem Zeitpunkt der Übermittlung verstrichen ist, wird die Spam-Variable festgelegt. Dieser Code kennzeichnet die Nachricht auch als Spam, wenn der formtime-Wert in einen anderen Wert geändert wurde, z. B. eine URL oder eine E-Mail-Adresse.

if($_POST['formtime'] < time()-3600) { $spam=true; } Erstellen Sie eine mehrstufige Formular- oder Formularprüfungsseite

Durch das Erstellen eines mehrstufigen Formularprozesses können die meisten Spambots das eigentliche Skript nicht finden, das die endgültigen Formulardaten verarbeitet. Dies kann so einfach sein, wie der Benutzer seine Eingabe nach dem Absenden eines Formulars überprüfen und dann eine zweite Schaltfläche auswählen muss, um die Formularelemente tatsächlich zur Verarbeitung einzureichen. Dies kann noch narrensicherer gemacht werden, wenn das Originalformular und die Verifizierungsseite unter der gleichen URL verarbeitet werden. Wenn die Formularelementdaten serverseitig vor dem abschließenden Verifizierungsschritt gespeichert sind (und nicht in versteckten Formularelementen, die von dem Spambot übermittelt werden können), wird es für ein automatisiertes System sehr schwierig, das Formular zu senden.

if($formsubmitted == true) { // database the form elements and display the verification page. // If the user verifies the form information, then process the databased data. } else { // display the empty form } Stellen Sie sicher, dass das Formular von Ihrem Server bereitgestellt wird

Da die meisten Spambots von einem Remote-Computer an Ihr Formular-Skript senden, können Sie verhindern, dass viele Spambots das Formular an Ihr Verarbeitungs-Skript senden, indem Sie feststellen, ob die Formularinformationen von Ihrer eigenen Website stammen. Die meisten Skriptprogramme können den Seitenverweis oder die Seite überprüfen, die verwendet wurde, um zur aktuellen Seite zu gelangen. Es ist wichtig zu beachten, dass es für Spambots ziemlich einfach ist, die Referrer-Informationen so zu fälschen, als ob das Formular von Ihrem Webserver kommt. Außerdem werden einige Browser und Firewalls den Referrer-Header überhaupt nicht senden.

Der folgende Code überprüft, ob der Seitenverweis (in der HTTP-Spezifikation und in PHP falsch als "Referer" bezeichnet) vorhanden ist. Wenn dies der Fall ist, befindet sich die verweisende Seite auf derselben Website wie das Formularverarbeitungsskript. Bei Browsern oder Spambots, die keine Referrer-Informationen senden, wird die Nachricht niemals als Spam gekennzeichnet.

if((isset($_SERVER['HTTP_REFERER']) && stristr($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST']))) { $spam=true; } Fazit

Das Verhindern von Spam-Übermittlungen an Webformulare ist eine schwierige Arbeit. Wenn möglich, sollten wir jedoch die Last der Verhinderung von Spam für den Endbenutzer nicht durch CAPTCHA oder andere Turing-Tests aufbringen. Jedes Mal, wenn der Benutzer dafür verantwortlich ist, manuell nachzuweisen, dass er ein Mensch ist, wird die Zugänglichkeit verringert. Diese Techniken bieten mehrere Methoden zum Ausfiltern der meisten Form-Spambots, ohne den Endbenutzer zu belasten.

Ich bin mir sicher, dass dies nicht alle Möglichkeiten sind und es wahrscheinlich ist, dass es oben in meinen Techniken Fehler gibt. Wenn Sie Kommentare oder bessere Techniken haben, schreiben Sie sie bitte unten.

Paylaş: