506 Stimmen

Scripter daran hindern, Ihre Website zu blockieren

Ich habe eine Antwort akzeptiert, aber ich glaube leider, dass wir bei unserem ursprünglichen Worst-Case-Szenario bleiben müssen: CAPTCHA jeder auf Kaufversuche der Mist . Kurze Erklärung: Caching/Webfarmen machen es unmöglich, Zugriffe zu verfolgen, und jede Umgehung (Senden eines nicht gecachten Web-Beacons, Schreiben in eine einheitliche Tabelle usw.) verlangsamt die Website stärker, als es die Bots tun würden. Es gibt wahrscheinlich teure Hardware von Cisco oder ähnlichem, die auf hohem Niveau helfen kann, aber es ist schwer, die Kosten zu rechtfertigen, wenn das CAPTCHA-Verfahren für alle eine Alternative ist. Ich werde später versuchen, eine ausführlichere Erklärung abzugeben und die Seite für künftige Suchende zu säubern (obwohl andere es gerne versuchen können, da es sich um ein Community-Wiki handelt).

Situation

Hier geht es um die Tüten-Mist-Verkäufe auf woot.com. Ich bin der Präsident von Woot Workshop, der Tochtergesellschaft von Woot, die das Design macht, die Produktbeschreibungen, Podcasts und Blogbeiträge schreibt und die Foren moderiert. Ich arbeite mit CSS/HTML und bin mit anderen Technologien nur wenig vertraut. Ich arbeite eng mit den Entwicklern zusammen und habe alle Antworten hier (und viele andere Ideen, die wir hatten) durchgesprochen.

Die Benutzerfreundlichkeit macht einen großen Teil meiner Arbeit aus, und die Website spannend und unterhaltsam zu gestalten, macht den größten Teil der Arbeit aus. Daraus leiten sich die drei folgenden Ziele ab. CAPTCHA schadet der Benutzerfreundlichkeit, und Bots stehlen den Spaß und die Spannung aus unseren Mistverkäufen.

Bots stürmen unsere Titelseite zig Mal pro Sekunde und scannen (und/oder scannen unser RSS) für den Random Crap Sale. In dem Moment, in dem sie das sehen, wird eine zweite Stufe des Programms ausgelöst, die sich anmeldet, auf "I want One" klickt, das Formular ausfüllt und den Mist kauft.

Bewertung

lc : Bei Stackoverflow und anderen Seiten, die diese Methode verwenden, handelt es sich fast immer um authentifizierte (angemeldete) Benutzer, weil die Aufgabe, die versucht wird, dies erfordert.

Auf Woot können anonyme (nicht angemeldete) Benutzer unsere Homepage sehen. Mit anderen Worten, die Slamming-Bots können nicht authentifiziert sein (und sind im Wesentlichen nicht verfolgbar, außer über die IP-Adresse).

Also müssen wir wieder nach IPs scannen, was a) im Zeitalter von Cloud-Networking und Spambot-Zombies ziemlich nutzlos ist und b) angesichts der Anzahl von Unternehmen, die von einer IP-Adresse ausgehen, zu viele Unschuldige erwischt (ganz zu schweigen von den Problemen mit nicht-statischen IP-ISPs und den potenziellen Leistungseinbußen bei dem Versuch, dies zu verfolgen).

Oh, und dass man uns anruft, wäre das schlimmstmögliche Szenario. Können wir sie Sie anrufen lassen?

BradC : Die Methoden von Ned Batchelder sehen ziemlich cool aus, aber sie sind eindeutig darauf ausgelegt, Bots zu besiegen, die für ein Netz von Websites entwickelt wurden. Unser Problem ist, dass die Bots speziell dafür entwickelt wurden, unsere Website zu überwinden. Einige dieser Methoden könnten wahrscheinlich für eine kurze Zeit funktionieren, bis die Skripter ihre Bots so weiterentwickelt haben, dass sie den Honeypot ignorieren, den Bildschirm nach nahegelegenen Labelnamen anstelle von Formular-IDs durchsuchen und eine javascriptfähige Browsersteuerung verwenden.

Nochmals lc : "Es sei denn, der Hype ist Teil Ihres Marketingkonzepts." Ja, das ist er definitiv. Die Überraschung, wenn der Artikel erscheint, sowie die Aufregung, wenn man es schafft, einen zu bekommen, ist wahrscheinlich genauso wichtig oder wichtiger als der Mist, den man am Ende tatsächlich bekommt. Alles, was das Prinzip "Wer zuerst kommt, mahlt zuerst" abschafft, schadet dem Nervenkitzel beim "Gewinnen" des Mistes.

novatrust : Und ich für meinen Teil begrüße unsere neuen Bot-Oberherren. Wir bieten tatsächlich RSS-Feeds an, damit Anwendungen von Drittanbietern unsere Website nach Produktinformationen durchsuchen können, aber nicht vor dem HTML-Code der Hauptseite. Wenn ich es richtig interpretiere, hilft Ihre Lösung Ziel 2 (Leistungsprobleme), indem sie Ziel 1 komplett opfert und sich mit der Tatsache abfindet, dass Bots den meisten Mist kaufen werden. Ich habe Ihre Antwort hochgestuft, weil ich Ihren Pessimismus im letzten Absatz für richtig halte. Es scheint hier kein Patentrezept zu geben.

Die übrigen Antworten stützen sich im Allgemeinen auf die IP-Verfolgung, die wiederum sowohl nutzlos (bei Botnetzen/Zombies/Cloud-Networking) als auch nachteilig zu sein scheint (es werden viele Unschuldige erwischt, die von denselben IP-Zielen kommen).

Gibt es andere Ansätze/Ideen? Meine Entwickler sagen immer wieder "lasst uns einfach CAPTCHA machen", aber ich hoffe, dass es weniger aufdringliche Methoden gibt, um alle tatsächlichen Menschen, die etwas von unserem Mist wollen.

Ursprüngliche Frage

Angenommen, Sie verkaufen etwas Billiges, das einen sehr hohen Wert hat, und Sie haben nur eine sehr begrenzte Menge. Niemand weiß genau, wann Sie diesen Artikel verkaufen werden. Und über eine Million Menschen kommen regelmäßig vorbei, um zu sehen, was Sie verkaufen.

Das führt dazu, dass Skripter und Bots programmgesteuert versuchen, [a] herauszufinden, wann du den besagten Gegenstand verkaufst, und [b] sicherzustellen, dass sie unter den ersten sind, die ihn kaufen. Das ist aus zwei Gründen ätzend:

  1. Ihre Website wird von nicht-menschlichen Nutzern überflutet und verlangsamt die Abläufe für alle.
  2. Am Ende "gewinnen" die Drehbuchautoren das Produkt, wodurch sich die Stammkunden betrogen fühlen.

Eine scheinbar offensichtliche Lösung ist es, einige Hürden zu schaffen, durch die Ihre Nutzer springen müssen, bevor sie ihre Bestellung aufgeben können, aber es gibt mindestens drei Probleme dabei:

  • Die Benutzererfahrung für Menschen ist miserabel, da sie CAPTCHA entziffern, die Katze herauspicken oder eine Matheaufgabe lösen müssen.
  • Wenn der wahrgenommene Nutzen hoch genug und die Menge groß genug ist, wird eine Gruppe einen Weg finden, jede Verbesserung zu umgehen, was zu einem Wettrüsten führt. (Dies gilt umso mehr, je einfacher die Änderung ist; ein verstecktes "Kommentar"-Formular, die Neuanordnung der Formularelemente, eine falsche Beschriftung, ein versteckter "Fauxpas"-Text - all dies funktioniert einmal und muss dann geändert werden, um dieses spezielle Formular zu bekämpfen).
  • Selbst wenn die Skripter Ihren Tweak nicht "lösen" können, hindert sie das nicht daran, Ihre Titelseite zuzuschlagen und dann einen Alarm auszulösen, damit der Skripter den Auftrag manuell ausfüllen kann. Da sie durch die Lösung von [a] im Vorteil sind, werden sie wahrscheinlich trotzdem [b] gewinnen, da sie die ersten Menschen sein werden, die die Bestellseite erreichen. Außerdem tritt 1. immer noch auf, was zu Serverfehlern und einer verminderten Leistung für alle führt.

Eine andere Lösung besteht darin, auf IPs zu achten, die zu oft auftauchen, sie in der Firewall zu blockieren oder sie anderweitig an der Bestellung zu hindern. Dies könnte 2. lösen und [b] verhindern, aber der Leistungseinbruch durch das Scannen nach IPs ist massiv und würde wahrscheinlich mehr Probleme wie 1. verursachen, als die Skripter selbst verursachen. Außerdem macht die Möglichkeit von Cloud-Netzwerken und Spambot-Zombies die IP-Prüfung ziemlich nutzlos.

Eine dritte Idee, nämlich das Laden des Bestellformulars für eine gewisse Zeit (z.B. eine halbe Sekunde) zu erzwingen, würde möglicherweise den Fortschritt der schnellen Bestellungen verlangsamen, aber auch hier wären die Skripter immer noch die ersten, und das bei einer Geschwindigkeit, die für die tatsächlichen Benutzer nicht nachteilig ist.

Ziele

  1. Verkaufen Sie den Gegenstand an Menschen, die keine Skripte schreiben.
  2. Sorgen Sie dafür, dass die Website mit einer Geschwindigkeit läuft, die nicht durch Bots gebremst wird.
  3. Belästigen Sie die "normalen" Benutzer nicht mit Aufgaben, die sie erfüllen müssen, um zu beweisen, dass sie Menschen sind.

6voto

falstro Punkte 32879

Es gibt bereits ein paar andere/bessere Lösungen, aber der Vollständigkeit halber möchte ich diese hier erwähnen:

Wenn Ihr Hauptanliegen die Verschlechterung der Leistung ist, und Sie sich für echte Hämmern dann haben Sie es tatsächlich mit einem DoS-Angriff zu tun, und Sie sollten versuchen, ihn entsprechend zu behandeln. Ein gängiger Ansatz besteht darin, Pakete von einer IP-Adresse in der Firewall nach einer bestimmten Anzahl von Verbindungen pro Sekunde/Minute/etc. einfach zu verwerfen. Die Standard-Linux-Firewall iptables verfügt beispielsweise über eine Standardfunktion 'hashlimit', die dazu verwendet werden kann, Verbindungsanfragen pro Zeiteinheit mit einer IP-Adresse zu korrelieren.

Obwohl diese Frage wahrscheinlich eher auf das nächste SO-Derivat zutreffen würde, das im letzten SO-Podcast erwähnt wurde, ist es noch nicht auf den Markt gekommen, so dass ich denke, es ist in Ordnung, darauf zu antworten :)

EDIT:
Wie novatrust feststellte, gibt es immer noch Internetdiensteanbieter, die ihren Kunden KEINE IPs zuweisen, so dass ein Skript-Kunde eines solchen Internetdiensteanbieters effektiv alle Kunden dieses Anbieters deaktivieren würde.

5voto

Denis Hennessy Punkte 6833

Schreiben Sie einen Reverse-Proxy auf einem Apache-Server vor Ihrer Anwendung, der ein Tarpit implementiert (Wikipedia-Artikel) um Bots zu bestrafen. Sie würde einfach eine Liste von IP-Adressen verwalten, die in den letzten Sekunden eine Verbindung hergestellt haben. Sie erkennen einen Ansturm von Anfragen von einer einzigen IP-Adresse und verzögern diese Anfragen exponentiell, bevor sie reagieren.

Natürlich können mehrere Menschen von der gleichen IP-Adresse kommen, wenn sie eine NAT-Netzwerkverbindung haben, aber es ist unwahrscheinlich, dass ein Mensch sich an einer Antwortzeit von 2mS bis 4mS (oder sogar 400mS) stört, während ein Bot durch die zunehmende Verzögerung ziemlich schnell behindert wird.

5voto

Joe Phillips Punkte 46741
  1. Stellen Sie einen RSS-Feed bereit, damit sie nicht Bandbreite verbrauchen.
  2. Beim Kauf, lassen Sie jeden eine zufällig eine Zeitspanne von bis zu 45 Sekunden oder so, je nachdem, was man wonach Sie genau suchen. Genau was sind Ihre zeitlichen Beschränkungen?
  3. Geben Sie allen eine Minute Zeit, um ihren Namen für die Verlosung einzutragen, und wählen Sie dann eine Person nach dem Zufallsprinzip aus. Ich denke, das ist die fairste Methode.
  4. Überwachen Sie die Konten (fügen Sie einige Zeiten in die Sitzung ein und speichern Sie sie?) und fügen Sie Verzögerungen für Konten hinzu, die anscheinend unter der menschlichen Geschwindigkeitsschwelle liegen. Dadurch werden die Bots zumindest so programmiert, dass sie langsamer werden und mit den Menschen konkurrieren.

5voto

Toybuilder Punkte 10701

Zunächst einmal ist es per Definition unmöglich, zustandslose, d. h. wirklich anonyme Transaktionen zu unterstützen und gleichzeitig Bots von legitimen Nutzern zu trennen.

Wenn wir die Prämisse akzeptieren können, dass wir einem brandneuen Woot-Besucher bei seinen ersten Seitenaufrufen gewisse Kosten auferlegen können, habe ich eine mögliche Lösung. In Ermangelung eines besseren Namens werde ich diese Lösung locker "Ein Besuch beim Kraftfahrzeugamt" nennen.

Nehmen wir an, es gibt ein Autohaus, das jeden Tag ein anderes neues Auto anbietet, und an manchen Tagen können Sie einen exotischen Sportwagen für 5 Dollar pro Stück (maximal 3) kaufen, zuzüglich 5 Dollar für den Transport.

Der Haken an der Sache ist, dass das Autohaus verlangt, dass Sie das Autohaus besuchen und einen gültigen Führerschein vorzeigen, bevor Sie durch die Tür gehen dürfen, um zu sehen, welches Auto zum Verkauf angeboten wird. Außerdem müssen Sie den besagten gültigen Führerschein haben, um den Kauf zu tätigen.

Dem Erstbesucher (nennen wir ihn Bob) dieses Autohauses wird also der Zutritt verweigert, und er wird an die Zulassungsstelle verwiesen (die sich praktischerweise gleich nebenan befindet), um einen Führerschein zu erwerben.

Andere Besucher mit einem gültigen Führerschein werden nach Vorlage des Führerscheins eingelassen. Wer den ganzen Tag herumlungert, die Verkäufer belästigt, Prospekte mitgehen lässt und den kostenlosen Kaffee und die Kekse leert, wird irgendwann abgewiesen.

Nun zurück zu Bob ohne Führerschein - er muss nur einmal den Besuch bei der Zulassungsstelle überstehen. Danach kann er das Autohaus besuchen und jederzeit Autos kaufen, es sei denn, er hat versehentlich seine Brieftasche zu Hause vergessen oder sein Führerschein wird aus anderen Gründen zerstört oder entzogen.

Der Führerschein ist in dieser Welt fast unmöglich zu fälschen.

Beim Besuch der Zulassungsstelle müssen Sie zunächst das Antragsformular in der "Start Here"-Warteschlange abholen. Bob muss den ausgefüllten Antrag zum Schalter Nr. 1 bringen, wo der erste von vielen mürrischen Beamten seinen Antrag entgegennimmt, ihn bearbeitet und, wenn alles in Ordnung ist, den Antrag für den Schalter abstempelt und ihn zum nächsten Schalter schickt. Und so geht Bob von Fenster zu Fenster und wartet darauf, dass jeder Schritt seines Antrags bearbeitet wird, bis er schließlich am Ende ankommt und seinen Führerschein erhält.

Es hat keinen Sinn, zu versuchen, das DMV "kurzzuschließen". Wenn die Formulare nicht in dreifacher Ausfertigung korrekt ausgefüllt werden oder wenn an irgendeinem Schalter falsche Antworten gegeben werden, wird der Antrag zerrissen und der unglückliche Kunde zurück an den Start geschickt.

Interessanterweise dauert es, unabhängig davon, wie voll oder leer das Büro ist, immer etwa gleich lange, bis man an jedem einzelnen Fenster bedient wird. Selbst wenn man die einzige Person in der Schlange ist, scheint das Personal einen gerne eine Minute hinter der gelben Linie warten zu lassen, bevor es sagt: "Der Nächste!

Bei der Straßenverkehrsbehörde sind die Dinge jedoch nicht ganz so schlimm. Während der Wartezeit und der Bearbeitung des Führerscheins können Sie sich in der Lobby der Zulassungsstelle einen sehr unterhaltsamen und informativen Werbespot für ein Autohaus ansehen. Der Werbespot läuft gerade lange genug, um die Zeit zu überbrücken, die Sie mit der Ausstellung Ihres Führerscheins verbringen.

Die etwas technischere Erklärung:

Wie ich oben schon sagte, ist es notwendig, eine gewisse Statefulness in der Client-Server-Beziehung zu haben, die es erlaubt, Menschen von Bots zu unterscheiden. Dies sollte auf eine Weise geschehen, die den anonymen (nicht authentifizierten) menschlichen Besucher nicht übermäßig benachteiligt.

Dieser Ansatz erfordert wahrscheinlich eine AJAX-artige clientseitige Verarbeitung. Ein brandneuer Besucher von woot erhält die "Welcome New User!"-Seite voller Text und Grafiken, die (durch entsprechende serverseitige Drosselung) ein paar Sekunden braucht, um vollständig zu laden. Während dies geschieht (und der Besucher vermutlich damit beschäftigt ist, die Willkommensseite(n) zu lesen), wird sein Identifizierungs-Token langsam zusammengesetzt.

Nehmen wir einmal an, der Token (auch "Führerschein" genannt) besteht aus 20 Chunks. Um die einzelnen Chunks zu erhalten, muss der clientseitige Code eine gültige Anfrage an den Server senden. Der Server baut eine absichtliche Verzögerung ein (sagen wir 200 Millisekunden), bevor er das nächste Chunk zusammen mit dem "Stempel" sendet, der für die nächste Chunk-Anforderung benötigt wird (d. h. die Stempel, die benötigt werden, um von einem DMV-Fenster zum nächsten zu gelangen). Alles in allem müssen etwa 4 Sekunden vergehen, um den Prozess Chunk-Anforderung-Antwort-Chunk-Anforderung-Antwort-...-Chunk-Anforderung-Antwort-Abschluss abzuschließen.

Am Ende dieses Prozesses verfügt der Besucher über ein Token, das es ihm ermöglicht, die Seite mit der Produktbeschreibung aufzurufen, die wiederum zur Kaufseite führt. Das Token ist eine eindeutige ID für jeden Besucher und kann dazu verwendet werden, seine Aktivitäten zu drosseln.

Auf der Serverseite akzeptieren Sie nur Seitenaufrufe von Clients, die über ein gültiges Token verfügen. Oder, wenn es wichtig ist, dass jeder die Seite letztendlich sehen kann, setzen Sie eine Zeitstrafe auf Anfragen, die kein gültiges Token haben.

Damit dies für den legitimen menschlichen Besucher relativ unbedenklich ist, muss der Vorgang der Tokenausgabe relativ unauffällig im Hintergrund ablaufen. Daher die Notwendigkeit einer Willkommensseite mit unterhaltsamen Texten und Grafiken, die absichtlich etwas verlangsamt wird.

Dieser Ansatz zwingt die Bots dazu, entweder ein bereits vorhandenes Token zu verwenden oder die minimale Einrichtungszeit zu nutzen, um ein neues Token zu erhalten. Natürlich hilft dies nicht so sehr gegen ausgeklügelte Angriffe, die ein verteiltes Netz von falschen Besuchern nutzen.

4voto

jwanagel Punkte 4038

Man kann Bots nicht völlig verhindern, auch nicht mit einem Captcha. Man kann jedoch die Erstellung und Pflege eines Bots erschweren und so die Zahl der Bots verringern. Vor allem wenn man sie zwingt, ihre Bots täglich zu aktualisieren, werden die meisten das Interesse verlieren.

Hier sind einige Ideen, die das Schreiben von Bots erschweren:

  • Die Ausführung einer Javascript-Funktion ist erforderlich. Javascript macht es sehr viel schwieriger, einen Bot zu schreiben. Vielleicht erfordern ein Captcha, wenn sie nicht laufen javascript noch tatsächliche Nicht-Javascript-Benutzer (minimal) zu ermöglichen.

  • Zählen Sie die Tastenanschläge bei der Eingabe in das Formular (wiederum über Javascript). Wenn es nicht menschenähnlich ist, verwerfen Sie es. Es ist mühsam, die menschliche Eingabe in einem Bot zu imitieren.

  • Schreiben Sie Ihren Code, um die IDs Ihrer Felder täglich mit einem neuen Zufallswert zu aktualisieren. Dadurch werden sie gezwungen, ihren Bot täglich zu aktualisieren, was eine Qual ist.

  • Schreiben Sie Ihren Code so, dass Sie Ihre Felder täglich neu anordnen (natürlich auf eine Art und Weise, die für Ihre Benutzer nicht zufällig ist). Wenn sie sich auf die Feldreihenfolge verlassen, wird sie das aus dem Konzept bringen und wiederum tägliche Wartungsarbeiten an ihrem Bot-Code erzwingen.

  • Sie können sogar noch weiter gehen und Flash-Inhalte verwenden. Flash ist ein echtes Ärgernis, wenn man einen Bot dagegen schreibt.

Wenn man sich darauf einstellt, sie nicht zu verhindern, sondern ihnen mehr Arbeit zu machen, kann man wahrscheinlich das gewünschte Ziel erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X