Wie kann verhindert werden, dass Roboter automatisch ein Formular ausfüllen?


105

Ich versuche, einen ausreichend guten Anti-Spam-Mechanismus zu entwickeln, um automatisch generierte Eingaben zu verhindern. Ich habe gelesen, dass Techniken wie Captcha, 1 + 1 =? Sachen funktionieren gut, aber sie stellen auch einen zusätzlichen Schritt dar, der die kostenlose schnelle Nutzung der Anwendung behindert (ich suche bitte nicht nach so etwas).

Ich habe versucht, einige versteckte Felder in allen meinen Formularen display: none; festzulegen. Ich bin jedoch sicher, dass ein Skript so konfiguriert werden kann, dass diese Formularfeld-ID verfolgt und einfach nicht ausgefüllt wird.

Implementieren / kennen Sie eine gute Methode gegen Roboter zum automatischen Ausfüllen von Formularen? Gibt es etwas, das nahtlos mit der serverseitigen Verarbeitung von HTML UND / ODER funktioniert und (fast) kugelsicher ist? (Ohne JS könnte man es einfach deaktivieren).

Ich versuche, mich dabei nicht auf Sitzungen zu verlassen (dh zu zählen, wie oft auf eine Schaltfläche geklickt wird, um Überlastungen zu vermeiden).


5
Vielen Dank, dass Sie keine Captcha-Lösungen wünschen! IMO, Form-Spam ist ein Problem für Websitebesitzer und die Verhinderung ist keine Belastung, die der Benutzer tragen sollte. Es gibt viel zu viele alternative Möglichkeiten, wie wir Spam auf der Website-Seite beheben können, wie die Antworten hier belegen. Methoden, die eine Benutzerinteraktion erfordern, sollten nur von Faulen oder Anfängern verwendet werden.
Mike

Antworten:


73

Eine einfach zu implementierende, aber nicht narrensichere Methode (insbesondere bei "bestimmten" Angriffen) zur Lösung von Anti-Spam besteht darin, die Zeit zwischen dem Senden des Formulars und dem Laden der Seite zu verfolgen.

Bots fordern eine Seite an, analysieren die Seite und senden das Formular. Das geht schnell.

Menschen geben eine URL ein, laden die Seite, warten, bis die Seite vollständig geladen ist, scrollen nach unten, lesen den Inhalt, entscheiden, ob sie das Formular kommentieren / ausfüllen möchten, benötigen Zeit, um das Formular auszufüllen, und senden es ab.

Der Zeitunterschied kann subtil sein; und wie diese Zeit ohne Cookies verfolgt werden kann, erfordert eine Art serverseitige Datenbank. Dies kann sich auf die Leistung auswirken.
Außerdem müssen Sie die Schwellenzeit anpassen.


9
Achten Sie darauf, ob Sie Endbenutzern die Verwendung automatischer Formularfüller wie addons.mozilla.org/en-US/firefox/addon/1882 ermöglichen möchten , die möglicherweise eine sehr schnelle Übermittlung ermöglichen. Neben Captcha ist alles, was den Endbenutzer stört, im Allgemeinen nicht gut, insbesondere wenn verhindert wird, dass eine Person in einem Hury (sehr) schnell geht.
Schneeflocke

1
Guter Punkt, aber alles hängt vom Kontext ab. Wenn es sich bei dem Formular um ein Anmeldeformular handelt, stimme ich Ihnen voll und ganz zu. Aber warum die Anmeldung von Bots deaktivieren? Wenn der Kontext ein Kommentarfeld ist, wie dieses bei StackOverflow, weiß ich sicher: Wenn Sie ein Kommentarfeld automatisch ausfüllen, sind Sie ein Spammer. Beachten Sie, dass Sie bei Verwendung der automatischen Füllung für Signaturen immer noch Zeit benötigen, um Inhalte tatsächlich einzugeben.
Pindatjuh

5
Beachten Sie, dass SO so etwas tut. Bearbeiten Sie einen Kommentar zu schnell oder zu oft hintereinander, und Sie erhalten die Meldung "Sind Sie ein Mensch?" Seite.
Jakob Borg

2
Hacker werden das Formular nicht immer anfordern. Manchmal reicht eine sorgfältig gestaltete URL (mit GET oder POST) aus, um das Formular mit geringem Aufwand mehrmals zu veröffentlichen.
Crafter

1
Implementieren Sie dies mit Captcha. Wenn das Formular zu schnell gesendet wurde, legen Sie ein Captcha vor, um echte Benutzer durchzulassen.
Yashovardhan99

75

Ich finde tatsächlich, dass ein einfaches Honigtopffeld gut funktioniert. Die meisten Bots füllen jedes Formularfeld aus, in der Hoffnung, die erforderlichen Feldvalidatoren zu umgehen.

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

Wenn Sie ein Textfeld erstellen, es in Javascript ausblenden und dann sicherstellen, dass der Wert auf dem Server leer ist , werden 99% der Roboter dort draußen ausgesondert und 99% Ihrer Benutzer werden überhaupt nicht frustriert. Bei den verbleibenden 1%, für die Javascript deaktiviert ist, wird weiterhin das Textfeld angezeigt. Sie können jedoch in solchen Fällen eine Meldung wie "Dieses Feld leer lassen" hinzufügen (wenn Sie sich überhaupt um sie kümmern).

(Wenn Sie auf dem Feld style = "display: none" ausführen, ist es für einen Roboter viel zu einfach, dies nur zu sehen und das Feld zu verwerfen, weshalb ich den Javascript-Ansatz bevorzuge.)


1
Denken Sie, Bots gehen tatsächlich die CSS-Datei durch und stellen fest, dass sie angezeigt wird: keine; ? Ich verwende wirklich lieber keine JS-basierte Lösung, da sie leicht deaktiviert werden kann.
Gal

1
Es scheint eine alte Lösung für Webmaster zu sein, die Tonnen von nicht relevanten Schlüsselwörtern enthält, um ihr Webranking zu verbessern. Ich denke, Such-Crawler-Bots wie Google können sich vorstellen, dass sie angezeigt werden: keine. Warum sollten andere Bots das nicht können?
Schneeflocke

2
Ich habe diese Technik jetzt auf zwei Websites angewendet, die gehämmert wurden, und Bot-Anmeldungen sind jetzt auf beiden Null 0. Es hilft nicht gegen gezielte Angriffe, aber die meisten suchen sowieso nur nach Exploits oder Spam.
Nirvdrum

25
Kleiner Punkt hier: Um das JS-Problem zu umgehen , verwenden Sie einfach CSS, um Ihre Honeypot-Eingabe über der Seite oben zu positionieren. Auf diese Weise ist es in Ordnung, js zu deaktivieren, und um dies zu umgehen, muss der Bot in der Lage sein, CSS zu analysieren absolute Positionierung und treffen Sie eine vernünftige Entscheidung darüber, ob es sich um einen Honigtopf handelt oder nicht. ein bisschen kugelsicherer auf diese Weise :)
totalNotLizards

3
@ alexy13 Ja, es ist einfacher, aber wie in der Antwort angegeben, ist es für einen Bot auch viel einfacher, herauszufinden, was Sie tun möchten. Testen Sie einfach eine CSS-Eigenschaft. Wenn Sie jedoch die absolute Positionierungsstrategie verwenden, muss der Bot alle Ihre Positionierungsregeln und die Regeln der meisten Eltern des Elements analysieren , um herauszufinden, ob die Eingabe sichtbar ist oder nicht, und dann herauszufinden, ob oder nicht auf diese Informationen zu reagieren - das ist mehr Ärger als es für die meisten (wenn nicht alle) Bots wert ist.
totalNotLizards

22

Was ist, wenn - der Bot überhaupt keine findet form?

3 Beispiele:

  1. Fügen Sie Ihr Formular mit AJAX ein
  • Wenn Sie damit einverstanden sind, dass Benutzer JS deaktiviert haben und kein Formular sehen / senden können, können Sie sie benachrichtigen und Javascript zuerst mithilfe einer Noscript-Anweisung aktivieren:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • Erstellen Sie ein form.htmlund platzieren Sie es formin einem <div id="formContainer">Element.

  • Verwenden Sie auf der Seite, auf der Sie dieses Formular aufrufen müssen, eine leere <div id="dynamicForm"></div>und diese jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. Erstellen Sie Ihr Formular vollständig mit JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. Bot-Köder- Eingabe
  • Bots mögen ( wirklich mögen) freche Eingabeelemente wie:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • Nachdem Sie den obigen HTML-Code verwendet haben, können Sie auch CSS verwenden, um die Eingabe nicht anzuzeigen:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Jetzt, da Ihre Eingabe für den Benutzer nicht sichtbar ist, erwarten Sie in PHP, dass Ihre Eingabe $_POST["email"] leer sein sollte (ohne Wert)! Andernfalls senden Sie das Formular nicht ab.
  • Schließlich müssen Sie nur noch eine weitere Eingabe erstellen, wie <input name="sender" type="text" placeholder="Your email"> nach (!) Der "Bot-Bait" -Eingabe für die tatsächliche Benutzer-E-Mail-Adresse.

Danksagung:

Developer.Mozilla - Deaktivieren der automatischen Vervollständigung von Formularen
StackOverflow - Ignorieren von Tabindex


7
Könnte der Browser eines legitimen Benutzers das Köder-Eingabefeld möglicherweise als E-Mail-Feld sehen und es automatisch automatisch ausfüllen, wenn der Benutzer den Rest des Formulars automatisch ausfüllt? Der Benutzer würde nicht sehen, dass ein Feld weit vom Bildschirm ausgefüllt wurde, und sie würden immer noch wie ein Bot aussehen.
wilbbe01

Ich vermute autocomplete=nope, standardmäßig würde on;-) MDN: Eingabe # attr-autocomplete
behandeln

@handle es spielt keine Rolle, es ist eine Bot-Köder-Eingabe. Sie können autocomplete="oh sunny day"für diese Angelegenheit schreiben .
Roko C. Buljan

19

Was ich getan habe, ist, ein verstecktes Feld zu verwenden und den Zeitstempel darauf zu setzen und ihn dann mit dem Zeitstempel auf dem Server unter Verwendung von PHP zu vergleichen.

Wenn es schneller als 15 Sekunden war (abhängig davon, wie groß oder klein Ihre Formulare sind), war das ein Bot.

Ich hoffe das hilft


1
Gute Idee, ich würde das Limit jedoch auf ungefähr 3 bis 5 Sekunden setzen, um schnelle / Power-Benutzer zu ermöglichen. Ich verwende denselben Ansatz und setze ein Limit für meine Formulare auf 3 Sekunden, um 99% der Bots herauszufiltern.
Kayla

@adnhack Meinst du etwas wie: 1) beim Laden der Seite mit PHP Serverzeit holen und Sitzung erstellen. 2) Benutzer oder Bot füllt das Formular aus, klickt auf $.postSenden und sendet alles an eine externe PHP-Datei. 3) in externem PHP wieder Serverzeit bekommen und mit Sitzungszeit vergleichen?
Andris

16

Eine sehr effektive Möglichkeit, Spam praktisch zu beseitigen, besteht darin, ein Textfeld mit Text zu erstellen, z. B. "Diesen Text entfernen, um das Formular zu senden!". und dieser Text muss entfernt werden, um das Formular einzureichen.

Wenn das Textfeld bei der Formularüberprüfung den Originaltext oder einen beliebigen zufälligen Text enthält, senden Sie das Formular nicht ab. Bots können Formularnamen lesen und automatisch die Felder Name und E-Mail ausfüllen, wissen jedoch nicht, ob sie tatsächlich Text aus einem bestimmten Feld entfernen müssen, um ihn zu senden.

Ich habe diese Methode auf unserer Unternehmenswebsite implementiert und den Spam, den wir täglich erhielten, vollständig beseitigt. Es funktioniert wirklich!


Interessant, wissen Sie, ob es effektiver ist als die anderen Antworten ... ein verstecktes Textfeld oder die Zeit, die zum Ausfüllen des Formulars benötigt wird?
Austin Henley

4
Dies würde auch diejenigen Benutzer erfassen, die den Anweisungen nicht folgen können, was möglicherweise nicht erwünscht ist.
wilbbe01

Ich mag das! Bis der Bot verschiedene Kombinationen von leeren und ausgefüllten Feldern ausprobiert ... Der beste Weg, dies zu testen, besteht darin, dies zu implementieren und mit einem der folgenden zu scannen
nmit026

Wirksam, sofern die Person, die den Bot verwaltet, den Code nicht herausfindet und optimiert.
Talha Awan

11

Wie wäre es, wenn Sie ein Textfeld-Eingabefeld in derselben Farbe wie der Hintergrund erstellen, das leer bleiben muss. Dies umgeht das Problem einer Bot-Leseanzeige: keine


2
Fügen Sie dies bitte als Kommentar hinzu, wenn Sie mehr Ruf anstelle einer Antwort erhalten;)
Rob

3
Dies führt zu Zugänglichkeitsproblemen. Der Honeypot-Index wird Benutzern mit Bildschirmleseprogrammen nicht ausgeblendet.
Otterfan

5
Ich bin ein blinder Benutzer und habe einmal ein Formularfeld wie dieses gefunden. Auf dem Etikett darüber stand: "Wenn Sie dies sehen können, lassen Sie dieses Feld leer." Sehr effektive IMO.
Parham Doustdar

8

http://recaptcha.net/

reCAPTCHA ist ein kostenloser Antibot-Service, der bei der Digitalisierung von Büchern hilft

Es wurde von Google erworben (im Jahr 2009):

Siehe auch


5
Als Benutzer finde ich es oft schwierig, Recaptcha herauszufinden. Einige der Wörter sind so schwer zu lesen, dass Sie es am Ende drei- oder viermal versuchen müssen. Obwohl dies definitiv bei dem Roboterproblem helfen wird.
Brian


Ich habe mich auf dieser Seite wiedergefunden, weil CAPTCHA / reCAPTCHA derzeit das Senden von Bot-Formularen nicht stoppt. Dies ist 5 Jahre später und es ist eine neue Technik als zu dem Zeitpunkt, als diese Antwort gegeben wurde
JohnnyFaldo

Ich bin erstaunt, warum diese Antwort nicht mehr positive Stimmen hat. Unabhängig davon, ob der Benutzer dies wünscht oder nicht, ist dies eine großartige Lösung. Insbesondere, wenn es nur für das Anmeldeformular verwendet wird.
Towi_parallelism

Heutzutage beginnt Recaptcha als einfaches Kontrollkästchen. Vielleicht ist es nicht mehr so ​​schmerzhaft wie früher? ...
Rogerdpack

6

Viele dieser Spam-Bots sind nur serverseitige Skripte, die das Web durchsuchen. Sie können viele von ihnen bekämpfen, indem Sie die Formularanforderung vor dem Senden mit Javascript bearbeiten (dh ein zusätzliches Feld basierend auf einer Clientvariablen festlegen). Dies ist keine vollständige Lösung und kann zu vielen Problemen führen (z. B. Benutzer ohne Javascript, auf Mobilgeräten usw.), kann jedoch Teil Ihres Angriffsplans sein.

Hier ist ein triviales Beispiel ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

Irgendwo in Ihrem PHP-Skript ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

Außerdem sind Captchas großartig und wirklich die beste Verteidigung gegen Spam.


Vielen Dank, obwohl Javascript in jedem Browser leicht deaktiviert werden kann, wodurch mein "Anti-Spam-Mechanismus" zunichte gemacht wird. Ich suche also etwas globaleres.
Gal

Ich kann mich irren, aber würde dies nicht jedem JS-behinderten Benutzer sagen, dass Sie ein schlechter Client sind, bitte gehen Sie weg.
Gal

Gal ist ein triviales Beispiel, das lediglich zeigt, wie eine von clientseitigen js festgelegte Anforderungsvariable validiert werden kann.
John Himmelman

@ John Himmelman Captchas sind lösbar und nicht unbedingt die beste Verteidigung gegen Spam. Es gibt Pay-for-Services wie anti-captcha.com , die Form-Captchas gegen eine geringe Gebühr lösen.

Das Problem bei diesem Ansatz ist, dass ich viele Bots mit PhantomJS gesehen habe. Dies würde es ihnen ermöglichen, durchzukommen.
Parham Doustdar

4

Ich bin überrascht, dass noch niemand diese Methode erwähnt hat:

  • Fügen Sie Ihrer Seite ein kleines, verstecktes Bild hinzu.
  • Platzieren Sie einen Cookie, wenn Sie dieses Bild servieren.
  • Suchen Sie bei der Bearbeitung des Formulars nach dem Cookie.


Vorteile:

  • bequem für Benutzer und Entwickler
  • scheint zuverlässig zu sein
  • kein JavaScript

Nachteile:

  • fügt eine HTTP-Anforderung hinzu
  • erfordert, dass Cookies auf dem Client aktiviert sind


Diese Methode wird beispielsweise vom WordPress-Plugin Cookies for Comments verwendet .


Würden Bots, die Dinge wie PhantomJS verwenden, das nicht leicht umgehen?
Parham Doustdar

1
Da es sich um eine vollständige Browser-Engine handelt, die Assets und dergleichen lädt, sollte dies möglich sein. Trotzdem bin ich mir nicht sicher, ob es häufig für einen Spam-Bot verwendet wird, da es wahrscheinlich viel langsamer als cURL-Skripte ist.
Gras Double

Gibt es einen Grund, warum dies besser wäre als ein CSRF-Token?
Xenoterracide

1
Ein CSRF-Token wird einen Bot überhaupt nicht aufhalten. 1. Anfrage, Holen Sie sich das Formular, das das Token enthält. 2. Anfrage, POST das Formular, einschließlich des Tokens.
Gras Double

4

Mit dem Aufkommen von kopflosen Browsern (wie Phantomjs), die alles emulieren können, können Sie nicht annehmen, dass:

  • Spam-Bots verwenden kein Javascript.
  • Sie können Mausereignisse verfolgen, um Bot zu erkennen.
  • sie werden nicht sehen, dass ein Feld visuell verborgen ist,
  • Sie werden nicht eine bestimmte Zeit warten, bevor sie einreichen.

Wenn das früher wahr war, ist es nicht mehr wahr.

Wenn Sie keine benutzerfreundliche Lösung suchen, geben Sie ihnen einfach einen schönen "Ich bin ein Spammer" -Sendungsknopf :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

Natürlich können Sie mit zwei input[type=image]Bildschaltflächen spielen und die Reihenfolge nach jedem Laden, die Textalternativen, den Inhalt der Bilder (und ihre Größe) oder die nameder Schaltflächen ändern . Dies erfordert einige Serverarbeit.

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

Aus Gründen der Barrierefreiheit müssen Sie eine korrekte Textalternative angeben, aber ich denke, dass ein langer Satz für Screenreader-Benutzer besser ist, als als Bot betrachtet zu werden.

Zusätzlicher Hinweis: Diese Beispiele veranschaulichen, dass das Verstehen von Englisch (oder einer beliebigen Sprache) und das Treffen einer einfachen Wahl für einen Spambot schwieriger ist als: 10 Sekunden warten, mit CSS oder Javascript umgehen, wissen, dass ein Feld ausgeblendet ist, Mausbewegung emulieren oder Emulieren der Tastatureingabe, ...


Es scheint mir, dass die Tatsache, dass Sie den alternativen Text einfügen müssen, bedeutet, dass Ihre Zwei-Bild-Lösung genauso anfällig für Skripte ist wie die anderen Alternativen. Und für die Schaltfläche "Ich bin kein Spammer": Kann das nicht auch als Skript verwendet werden?
Hawkeye

@ Hawkeye Meine Antwort war, dass ein kopfloser Browser alles emulieren kann : Javascript, Verzögerungen, Mausbewegungen, versteckte Felder, ... Der Begriff "schön" vor meinen Beispielen war irgendwie "sarkastisch". Diese Beispiele zeigen jedoch, dass es für einen Spambot schwieriger ist, Englisch zu verstehen und eine einfache Entscheidung treffen zu müssen, als: 10 Sekunden warten, mit CSS oder Javascript umgehen, wissen, dass ein Feld ausgeblendet ist, Mausbewegungen emulieren oder Tastatureingaben emulieren, ...
Adam

Ich verstehe deinen Standpunkt jetzt. Fügen Sie Ihrer Antwort möglicherweise die letzte Aussage "Aber diese Beispiele veranschaulichen ..." usw. hinzu. Weil mir das geholfen hat zu verstehen, was du meinst. Es schien zunächst ein sich selbst widersprechendes Argument zu sein, dass "wir nicht davon ausgehen können, dass Bots nicht ...", aber dann Dinge auflisten, von denen wir immer noch nicht annehmen können, dass Bots es nicht können. Aber der Kern Ihres Punktes ist, dass Ihr Beispiel (eine Entscheidung treffen zu müssen, auf welcher Schaltfläche "Senden") schwieriger ist - was (jetzt, wo ich es verstehe) eine brillante Antwort ist. +1
Hawkeye

3

Eine sehr einfache Möglichkeit besteht darin, einige Felder bereitzustellen <textarea style="display:none;" name="input"></textarea>und alle Antworten, die dies ausgefüllt haben, zu verwerfen.

Ein anderer Ansatz besteht darin, das gesamte Formular (oder nur die Feldnamen) mit Javascript zu generieren. Nur wenige Bots können es ausführen.

Wie auch immer, Sie werden nicht viel gegen lebende "Bots" aus Taiwan oder Indien tun, die 0,03 US-Dollar pro gepostetem Link erhalten, und ihren Lebensunterhalt auf diese Weise verdienen.


2
Ich weiß, dass diese Antwort fast 7 Jahre alt ist, aber ich denke, dass es sich lohnt, dies zu kommentieren. Viele Bots können so programmiert werden, dass Felder mit einem style = "display: none" ignoriert werden, um diese Art von Schutz zu vermeiden.
Kenny Johnson

Es gibt Dutzende von Methoden, um Eingaben zu verdecken, Javascript zu verwenden, Dummy-Elemente darüber anzuzeigen, sie aus dem sichtbaren Bereich zu verschieben, sie so zu gestalten, dass sie sich perfekt in Hintergrund- oder Layoutdekorationen einfügen usw. Zufällige (Hashing-) Eingabenamen (und die Zuordnung beibehalten) of hashed => original in session serverseitig) hilft dabei, Namen nicht als Hinweise zu verwenden und manuell zuzuordnen, welche Eingaben gültig sind. Unabhängig davon gibt es keine Verteidigung gegen manuellen Spam.
SF.

2

Ich habe einen einfachen Ansatz zum Stoppen von Spammern, der zumindest meiner Erfahrung nach 100% effektiv ist und die Verwendung von reCAPTCHA und ähnlichen Ansätzen vermeidet. Nachdem ich diesen Ansatz implementiert hatte, ging ich in den letzten 5 Jahren von fast 100 Spam pro Tag auf einem der HTML-Formulare meiner Website auf Null.

Es nutzt die E-Mail-ALIAS-Funktionen der meisten HTML-Skripts für die Formularverarbeitung (ich verwende FormMail.pl) sowie einen grafischen Übermittlungscode, der in den einfachsten Grafikprogrammen einfach erstellt werden kann. Eine solche Grafik enthält den Code M19P17nH und die Aufforderung "Bitte geben Sie den Code links ein".

In diesem Beispiel wird eine zufällige Folge von Buchstaben und Zahlen verwendet, aber ich verwende in der Regel nicht englische Versionen von Wörtern, die meinen Besuchern bekannt sind (z. B. "pnofrtay"). Beachten Sie, dass die Eingabeaufforderung für das Formularfeld in die Grafik integriert ist und nicht im Formular angezeigt wird. Für einen Roboter gibt dieses Formularfeld also keinen Hinweis auf seinen Zweck.

Der einzige wirkliche Trick besteht darin, sicherzustellen, dass Ihr Formular-HTML diesen Code der Variablen "Empfänger" zuweist. Stellen Sie dann in Ihrem E-Mail-Programm sicher, dass jeder von Ihnen verwendete Code als E-Mail-Alias ​​festgelegt ist, der auf die E-Mail-Adressen verweist, die Sie verwenden möchten. Da das Formular keinerlei Aufforderung zum Lesen durch einen Roboter und keine E-Mail-Adressen enthält, hat er keine Ahnung, was in das leere Formularfeld eingefügt werden soll. Wenn nichts in das Formularfeld oder etwas anderes als akzeptable Codes eingefügt wird, schlägt die Formularübermittlung mit einem Fehler "Schlechter Empfänger" fehl. Sie können eine andere Grafik für verschiedene Formulare verwenden, obwohl dies meiner Erfahrung nach nicht unbedingt erforderlich ist.

Natürlich kann ein Mensch dieses Problem blitzschnell lösen, ohne alle Probleme, die mit reCAPTCHA und ähnlichen, eleganteren Schemata verbunden sind. Wenn ein menschlicher Spammer auf den Empfängerfehler reagiert und den Bildcode in den Roboter programmiert, können Sie ihn leicht ändern, sobald Sie feststellen, dass der Roboter für die Reaktion fest codiert wurde. In fünf Jahren, in denen ich diesen Ansatz verwendet habe, hatte ich noch nie Spam von einem der Formulare, auf denen ich ihn verwende, und ich hatte noch nie eine Beschwerde von einem menschlichen Benutzer der Formulare. Ich bin mir sicher, dass dies mit OCR-Funktionen im Roboter übertroffen werden kann, aber ich habe es noch nie auf einer meiner Websites erlebt, die HTML-Formulare verwenden. Ich habe auch "Spam-Traps" (versteckter HTML-Code "Komm her", der auf meine Anti-Spam-Richtlinien verweist) mit gutem Effekt verwendet, aber sie waren nur zu etwa 90% wirksam.


1

Ich denke hier an viele Dinge:

  1. Verwenden von JS (obwohl Sie es nicht möchten) zum Verfolgen der Mausbewegung, Tastendruck und Mausklick
  2. Abrufen der Empfehlungs-URL (in diesem Fall sollte es sich um eine URL aus derselben Domain handeln) ... Der normale Benutzer muss durch die Website navigieren, bevor er das Kontaktformular erreicht: PHP: Wie erhalte ich die Empfehlungs- URL?
  3. Verwenden einer $ _SESSION-Variablen, um die IP abzurufen und das Formular zum Senden an diese IP-Liste zu überprüfen
  4. Füllen Sie ein Textfeld mit einem Dummy-Text aus, den Sie auf der Serverseite überprüfen können, wenn er überschrieben wurde
  5. Überprüfen Sie die Browserversion: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Es ist klar, dass ein Bot keinen Browser, sondern nur ein Skript verwendet .
  6. Verwenden Sie AJAX, um die Felder einzeln zu senden und den Zeitunterschied zwischen den Einsendungen zu überprüfen
  7. Verwenden Sie eine gefälschte Seite vor / nach dem Formular, um eine weitere Eingabe zu senden

Könnten Sie einige dieser Schritte valicu2000 näher erläutern? Sind sie im Jahr 2020 noch gültig? Vielen Dank.
Michael Moriarty

0

Eine andere Möglichkeit, anstatt wie bei vielen Websites zufällige Buchstaben und Zahlen zu machen, besteht darin, zufällige Bilder von erkennbaren Objekten zu machen. Bitten Sie den Benutzer dann, entweder die Farbe des Bilds oder das Objekt selbst einzugeben.

Alles in allem wird jede Lösung ihre Vor- und Nachteile haben. Sie müssen einen glücklichen Median zwischen zu schwer für Benutzer, um den Antispam-Mechanismus zu passieren, und der Anzahl der Spam-Bots finden, die durchkommen können.


Gute Idee. Ich würde jedoch keine Farbe als Kriterium verwenden, da dies möglicherweise farbenblinde Benutzer ausschließt
Neil Aitken

Ja, guter Punkt. Tatsächlich besteht ein Problem bei Bildern im Allgemeinen darin, dass sie nicht zugänglich sind, und indem Roboter sie mit Alt-Tags "zugänglich" machen, können sie sie leicht herausfinden.
Brian

Bilder sind immer eine schlechte Idee ... der Text kann kaum gelesen werden, ich habe dieses Problem mit anderen Websites
konfrontiert

Dies ist nur Captcha mit einer sehr kleinen Wendung, die es für Benutzer schwieriger macht. Auch ist es überhaupt nicht zugänglich.
Mihai P.

0

Roboter können kein JavaScript ausführen. Sie können also beispielsweise ein verstecktes Element mit JavaScript in die Seite einfügen und dann vor dem Senden des Formulars feststellen, ob es vorhanden ist. Beachten Sie jedoch, dass bei einigen Benutzern auch JavaScript deaktiviert ist

Andernfalls werden Sie meiner Meinung nach gezwungen sein, eine Form des Kundenbeweises für "Menschlichkeit" zu verwenden.


4
Intelligente Roboter können Javascript ausführen. Mit einer Javascript-Lösung blockieren Sie jedoch 99% der Roboter
Ben Scheirman

Wenn der Bot ein Browser-Plugin ist, kann er Javascript ausführen und Dinge sehen, die der Benutzer sieht (selbst wenn Sie Flash- oder Webgl-Rendering ausführen)
CoffeDeveloper

Verwenden Sie einfach CSS, um das Textfeld über der Seite zu platzieren, wenn Sie Bedenken haben, dass JavaScript deaktiviert ist.
Chewie The Chorkie

0

Die beste Lösung, die ich gefunden habe, um zu vermeiden, dass Bots Spam versenden, ist die Verwendung einer sehr trivialen Frage oder eines Feldes in Ihrem Formular.

Versuchen Sie, ein Feld wie das folgende hinzuzufügen:

  • Kopieren Sie "Hallo" in die Box beiseite
  • 1 + 1 =?
  • Kopieren Sie den Namen der Website in das Feld

Diese Tricks erfordern, dass der Benutzer versteht, was in das Formular eingegeben werden muss, was es viel schwieriger macht, das Ziel des massiven Ausfüllens von Bot-Formularen zu sein.

BEARBEITEN

Die Rückseite dieser Methode ist, wie Sie in Ihrer Frage angegeben haben, der zusätzliche Schritt für den Benutzer, um sein Formular zu validieren. Aber meiner Meinung nach ist es viel einfacher als ein Captcha und der Aufwand beim Ausfüllen des Formulars beträgt nicht mehr als 5 Sekunden, was aus Anwendersicht akzeptabel erscheint.


Als Benutzer hasse ich diesen Mist. Ich verstehe, dass Spam ein Problem ist, aber wie ist es mein Problem als Site-Benutzer? Kommentar-Spam ist ein Problem für den Websitebesitzer. Daher sollte der Benutzer nicht die Last auf sich nehmen, es zu verhindern. Wenn Sie in ein Geschäft gehen und gebeten würden, Schutzschuhe über Ihre Schuhe zu ziehen, weil diese nicht wischen wollten, was würden Sie dann denken? Es dauert nur ein paar Sekunden, aber es ist nicht Ihre Last zu tragen.
Mike

Durch @Miki-Spam verschwendet ein Websitebesitzer Zeit. Zeit ist Geld, was ich verkaufe, wird für Sie teurer. Ihr Argument kann leicht verwendet werden, um zu sagen: "Es ist mir egal, dass Sie Miete zahlen müssen, ich möchte Produktionskosten + 1 $ bezahlen. Wie zahlen Sie Miete mein Problem?" Wenn Sie etwas kaufen, zahlen Sie für Hosting, Transport, Zeit usw.
Mihai P.

@Mike - Es ist Ihr Problem, weil Sie möchten, dass das Formular funktioniert (offensichtlich, weil Sie es verwenden). Maschinen finden selbst die dunkelsten Stellen und spammen täglich Zehntausende von Einsendungen, wodurch diese Formulare unbrauchbar werden. Wenn Sie also das nächste Mal eine Frage über ein Formular auf der Website eines kleinen Unternehmens einreichen, müssen Sie 9 + 3 hinzufügen, um dies zu tun ... und sich fragen: "Warum muss ich das tun?" Ihre Antwort kann sein "weil ich tatsächlich eine Antwort auf meine Frage möchte".
Jimbo Jonny

@ JimboJonny Du hast meinen Standpunkt völlig verfehlt. Spam ist ein Problem (wie ich bereits sagte), aber es gibt Möglichkeiten, es im Backend zu beheben, die die Benutzererfahrung nicht beeinträchtigen. Ich habe derzeit Kontaktformulare auf Dutzenden (sogar Hunderten) von Websites bereitgestellt, und Spam ist minimal (ein paar Spam-Nachrichten pro Monat pro Formular), da ich Spam programmgesteuert behandelt habe, nicht indem Benutzer durch Reifen springen. Mein Punkt war nicht, dass Spam kein Problem ist; Es ist ein Problem. Mein Punkt war, dass es Möglichkeiten gibt, dies zu beheben, ohne die Benutzererfahrung zu beeinträchtigen.
Mike

@JimboJonny Schauen Sie sich die am höchsten bewerteten (und akzeptierten) Antworten auf diese Frage an. Keine beinhaltet irgendeine Art von Benutzereingabe. So sollte Spam-Minderung sein.
Mike

0

Ein Tutorial dazu finden Sie auf der JQuery-Site. Obwohl es sich um JQuery handelt, ist die Idee rahmenunabhängig.

Wenn JavaScript nicht verfügbar ist, müssen Sie möglicherweise auf den CAPTCHA-Ansatz zurückgreifen.


0

Der einfache Weg, dies zu tun, besteht darin, ein Feld mit einem Wert einzufügen und den Benutzer zu bitten, den Text in diesem Feld zu entfernen. da Bots sie nur füllen. Wenn das Feld nicht leer ist, bedeutet dies, dass der Benutzer kein Mensch ist und nicht veröffentlicht wird. Es ist der gleiche Zweck eines Captcha-Codes.


0

Es ist nur eine Idee, die ich in meiner Anwendung verwendet habe und die gut funktioniert

Sie können ein Cookie bei Mausbewegung mit Javascript oder jquery erstellen und auf der Serverseite prüfen, ob ein Cookie vorhanden ist, da nur Menschen eine Maus haben. Ein Cookie kann nur von ihnen erstellt werden. Das Cookie kann ein Zeitstempel oder ein Token sein, das validiert werden kann


Interessante Idee! Hast du das überhaupt in der realen Welt benutzt?
Skybondsor

Es wird nicht funktionieren. Heutzutage verwenden Spammer Software, die im Browser ausgeführt wird. So können sie die Benutzererfahrung nachahmen, die das Cookie erstellt, und es dann x-mal mit verschiedenen Inhalten ausführen, die von der Software generiert werden.
Norbert Norbertson

Dies würde nicht funktionieren, wenn der Benutzer keine Maus verwenden würde. Wenn Ihr Formular ordnungsgemäß eingerichtet ist, sollte der Benutzer in der Lage sein, das gesamte Formular über die Tastatur auszufüllen. Sie können zu den nächsten Feldern wechseln, mithilfe der Leertaste Optionsfelder auswählen und die Leertaste (oder die Eingabetaste) verwenden, wenn Sie auf die Schaltfläche "Senden" klicken.
Kenny Johnson

0

Verwenden Sie 1) Formular mit Token 2) Überprüfen Sie das Formular, um eine Verzögerung mit der IP-Adresse zu bilden. 3) Blockieren Sie die IP (optional).


0

Nach meiner Erfahrung benötigen Sie keine besonderen Maßnahmen, wenn das Formular nur ein "Kontakt" -Formular ist. Spam wird von Webmail-Diensten anständig gefiltert (Sie können Webformular-Anfragen über Server-Skripte verfolgen, um zu sehen, wie effektiv Ihre E-Mail erreicht wird. Ich gehe natürlich davon aus, dass Sie einen guten Webmail-Dienst haben: D)

Übrigens versuche ich, mich nicht auf Sitzungen zu verlassen (z. B. zu zählen, wie oft auf eine Schaltfläche geklickt wird, um Überlastungen zu vermeiden).

Ich denke nicht, dass das gut ist. In der Tat möchte ich E-Mails von Benutzern erhalten, die bestimmte Aktionen ausführen, da dies die Benutzer sind, an denen ich interessiert bin (z. B. Benutzer, die sich die Seite "Lebenslauf" angesehen und den richtigen Kontakt verwendet haben bilden). Wenn der Benutzer also etwas tut, das ich möchte, beginne ich, seine Sitzung zu verfolgen und ein Cookie zu setzen (ich setze immer ein Sitzungscookie, aber wenn ich keine Sitzung starte, ist es nur ein gefälschtes Cookie, das gemacht wird, um zu glauben, dass der Benutzer eine Sitzung hat). Wenn der Benutzer etwas Unerwünschtes tut, kümmere ich mich nicht darum, eine Sitzung für ihn zu führen, damit keine Überlastung usw. auftritt.

Es wäre auch schön für mich, wenn Werbedienste eine Art API anbieten (die möglicherweise bereits vorhanden ist), um zu sehen, ob der Nutzer "die Anzeige angesehen" hat. Es ist wahrscheinlich, dass Nutzer, die Anzeigen betrachten, echte Nutzer sind, aber wenn dies nicht der Fall ist Wirklich gut, zumindest bekommst du sowieso 1 Ansicht, also nichts zu verlieren. (Und glauben Sie mir, die Anzeigensteuerung ist ausgefeilter als alles, was Sie alleine tun können.)


0

Eigentlich die Falle mit Display: Keine wirkt wie ein Zauber. Es ist hilfreich, die CSS-Deklaration in eine Datei zu verschieben, die globale Stylesheets enthält, wodurch Spam-Bots gezwungen werden, diese ebenfalls zu laden (eine direkte style = "display: none;" - Deklaration könnte wahrscheinlich von einem Spam-Bot interpretiert werden, ebenso wie a lokale Stildeklaration im Dokument selbst).

In Kombination mit anderen Gegenmaßnahmen sollte es für Spam-Bots schwierig sein, ihren Müll zu entladen (ich habe ein Gästebuch mit einer Vielzahl von Maßnahmen gesichert, und bisher sind sie auf meine primären Fallen hereingefallen - sollte jedoch ein Bot diese dort umgehen sind andere bereit auszulösen).

Was ich verwende, ist eine Kombination aus gefälschten Formularfeldern (auch als ungültige Felder bezeichnet, falls ein Browser verwendet wird, der CSS im Allgemeinen nicht verarbeitet oder anzeigt: keine im Besonderen), Überprüfung der Integrität (dh das Format der Eingabe) gültig?), Zeitstempel (sowohl zu schnelle als auch zu langsame Übermittlungen), MySQL (zur Implementierung von Blacklists basierend auf E-Mail- und IP-Adressen sowie Flutfiltern), DNSBLs (z. B. SBL + XBL von Spamhaus), Textanalyse ( zB Wörter, die ein starkes Indiz für Spam sind) und Bestätigungs-E-Mails (um festzustellen, ob die angegebene E-Mail-Adresse gültig ist oder nicht).

Ein Hinweis zu Bestätigungs-Mails: Dieser Schritt ist völlig optional. Wenn Sie ihn jedoch implementieren möchten, muss dieser Prozess so einfach wie möglich zu bedienen sein (dh er sollte darauf hinauslaufen, auf einen in der E-Mail enthaltenen Link zu klicken ) und veranlassen, dass die betreffende E-Mail-Adresse für einen bestimmten Zeitraum auf die Whitelist gesetzt wird, damit spätere Überprüfungen vermieden werden, falls der Benutzer zusätzliche Beiträge verfassen möchte.


0
  1. Ich benutze eine Methode, bei der es ein verstecktes Textfeld gibt. Da Bots die Website analysieren, füllen sie sie wahrscheinlich aus. Dann überprüfe ich, ob es leer ist, wenn es keine Website ist, die zurückkehrt.

  2. E-Mail-Bestätigung hinzufügen. Der Benutzer erhält eine E-Mail und muss auf einen Link klicken. Andernfalls verwerfen Sie den Beitrag in einiger Zeit.


0

Ich habe meinen Formularen eine Zeitüberprüfung hinzugefügt. Die Formulare werden nicht gesendet, wenn sie in weniger als 3 Sekunden ausgefüllt wurden. Dies hat für mich besonders bei den langen Formularen hervorragend funktioniert. Hier ist die Formularprüfungsfunktion, die ich über die Schaltfläche "Senden" aufrufe

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}

0

Mit immer ausgefeilteren Spam-Bots und Techniken wie automatisierten Browsern wird es schwieriger, die Spam-Quelle zu bestimmen. Unabhängig davon, ob es sich um Software, einen Menschen oder beides handelt, ist Spam aufgrund seines Inhalts Spam. Ich denke, die beste Lösung besteht darin, den veröffentlichten Inhalt über eine Anti-Spam-API wie Cleantalk oder Akismet auszuführen. Es ist relativ billig und effektiv und belästigt den Benutzer nicht. Sie können die Übermittlungszeiten von Formularen und die anderen herkömmlichen Überprüfungen auf weniger anspruchsvolle Bots überprüfen, bevor Sie die API aufrufen.


Was denkst du aus Neugier über reCAPTCHA? Sie sind die erste Erwähnung anderer kostenpflichtiger Dienste, aber wie vergleichen sich diese mit reCAPTCHA und / oder warum würden Sie diese ÜBER den kostenlosen Dienst empfehlen?
Hawkeye

0

Sie können versuchen, Spam-Roboter zu betrügen, indem Sie nach der Javascript-Validierung die richtige Aktion atribute hinzufügen. Wenn der Roboter Javascript blockiert, kann er das Formular niemals korrekt senden.

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

Ich füge dann nach .attr () einen "Rückruf" hinzu, um Fehler zu vermeiden.


-1

Nur meine fünf Cent wert. Wenn das Ziel darin besteht, 99% der Roboter zu stoppen, was ziemlich gut klingt, und wenn 99% der Roboter kein Java-Skript ausführen können, ist die beste Lösung, die alles übertrifft, einfach, kein Formular zu verwenden, mit dem eine Aktion zum Senden gesendet wird eine Post-URL.

Wenn das Formular über ein Java-Skript gesteuert wird und das Java-Skript die Formulardaten sammelt und dann über eine HTTP-Anforderung sendet, kann kein Roboter das Formular senden. Da die Senden-Schaltfläche Java-Skript verwenden würde, um den Code auszuführen, der das Formular sendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.