In den letzten Tagen habe ich etwas weniger geschrieben, da mein Weblog – mal wieder – Ziel von Comment-Spam-Bots war. Eigentlich hatte ich mir vorgenommen keine Wörtchen darüber zu verlieren, um diesen Spammern in meinem Leben keine weitere Sekunde zu widmen. Es kam anders. Trotz dessen das ich meine Kommentarfunktion von der Masse der anderen Movable-Type-Weblogs abhob, wurde ich trotzdem mit Kommentaren überschwemmt. Mit dem genau richtigen Timing, damit der Angreifer nicht vom MT-System erkannt und ignoriert wird.
Damit hatte ich nicht gerechnet. Die Spammer machten sich tatsächlich die Mühe mein Kommentarformular zu prüfen und ihre Bots darauf umzustellen. Sicherlich keine enorme Arbeit, da man ja nur das KeyValue »spam=Iam%not%a%Spammer« mit dem Müll mit schicken musste. In gewisser Weise fühlte ich mich sogar geehrt. Schliesslich machte sich wegen meines Blogs jemand eine gewisse Mühe – auch wenn es nur ein Spammer war.
Mein Sicherheitsprinzip beruhte auf der Monokultur von Movable-Type. Wenn es bei meinem Weblog nicht klappt Kommentare zu spammen, wird man schon weiter ziehen und jemand anderes belästigen – und mich links liegen lassen. So die Idee. Sie ging ungefähr vier Monate gut.
Eine Möglichkeit wäre eine zwingende Anmeldung eines jeden Kommentators. Dies hielt ich aber für nicht sinnvoll. Zu sehr stört es mich selbst wenn ich mich irgendwo anmelden muss – dann lasse ich es meistens auch bleiben. Ich würde aber ungern auf einen konstruktiven Kommentar verzichten. Die einzige akzeptable Lösung, um der Kommentarflut Einhalt zu gebieten, war die Trennung von Mensch und Maschine. Es kam nur CAPTCHA in Frage. Mein Weblog musste feststellen können ob jemand ein Mensch oder ein tumber Bot war. Dies erreicht man, indem man den Kommentator eine Aufgabe stellt, die für eine Maschine ein zu grosses oder gar ein unmögliches Problem darstellt. Diese unlösbaren Aufgaben findet man heute meistens im Bereich Mustererkennung. Computer sind in diesem Bereich noch sehr dumm und unterentwickelt. Das menschliche Gehirn ist ihnen dabei noch weit überlegen. Zum Beispiel aus drei Bilder das aussuchen, bei dem ein Männchen den grünen Hut trägt. Oder auf dem ein Fahrrad und eine Frau zu sehen ist. Dinge die heutzutage eine Maschine nicht lösen kann, ohne speziell dafür programmiert worden zu sein – um dann immer noch total inflexibel zu sein. Für den Menschen ist diese Aufgabe ein Klacks. Ich entschied mich für eine fünfstellige Zahl die in einem Bild angezeigt wird. Diese Zahl muss der Kommentator abtippen, um sich als »Mensch« zu identifizieren. Ist die Zahl falsch, wird der Kommentar nicht gespeichert. Spam-Bots müssen nun draussen bleiben, da es für sie keine leichte Möglichkeit gibt den richtigen Inhalt dieses Bitmaps zu entziffern.
Leider hat diese »effiziente« Methode auch einen gravierenden Nachteil. Neben Spammern werden nun auch Blinde und Analphabeten ausgesperrt. Wobei letztere wohl kaum einen Kommentar in meinen Weblog schreiben.
Um seinen Weblog (Movable Type 2.661) mit der selben Methode zu schützen, benötigt man nur drei Dateien. Die Datei captcha.php erzeugt beim Aufrufen ein Bild und speichert die angezeigte Zufallszahl in die captcha.txt. Man sollte darauf achten dass die Textdatei chmod 700 ist. Die wichtigste Datei ist die /lib/MT/App/Comments.pm die mit jedem Movable-Type 2.661 mit kommt. Diese einfach ersetzen und in den Zeilen 172 und 185 in der Comments.pm und Zeile 10 in der captcha.php den Pfad entsprechend seiner eigenen Umgebung ändern. Achtung, in der Comments.pm nicht das > oder < Zeichen vorne löschen. Alle drei Dateien kann man sich hier herunterladen. Leider musste ich PHP und Perl mischen, da ich die Installation der Perl-GD-Library, die in PHP integriert ist, als zu grossen Aufwand betrachtete.

24 Kommentare
Na wenigstens ist die Zahl leserlich.
Ich hatte es letzens mit einer Version zu tun da wurden verschiedene Schriftarten gemischt und mit Strichen hinterlegt. 3 Versuche hab ich gebraucht bis ich die richtige kombination entziffert hatte.
Btw. “Unsere” Software hat eine ganze Seite auf Stern.de bekommen
g3no, jetzt weiß ich was ich für eine DoS-Attacke hielt. Mein Web-server war dem Ansturm der Stern.de-Leser nicht gewachsen.
Du hast nen Bug in deinem captcha. Wenn du keinen Text und keinen Code eingibst, wirst du zu einer fehlerseite geleitet, dort sollst du deinen Beitrag ergänzen. Leider fehlt dort aber die captcha Textbox.
So, Problem behoben
Funktioniert das ganze auch mit MT 3.x?
Das Captcha.php würde ohne weiteres funktionieren. Das einzigste was angepasst werden müsste, wäre die Comments.pm.
Wie die aber in MT 3.x aussieht, weiß ich nicht.
Dann werde ich mir das Mal bei Gelegenheit (Ende Februar/Anfang März) anschauen und ggf. die Vorgehensweise für MT3 hier bekanntgeben, wenn das für Dich ok ist, lemming. Ok?
Na freilich. Ich freu mich ja, wenn einer an einem Code weiter wikiht (Wortkreation, drei Sekunden alt).
So, ein erster Zwischenbericht: die Commments.pm unterscheidet sich zwischen MT 2.661 und 3.15 doch erheblich - da brauche ich noch einige Zeit, bis ich das richtig verstanden habe.
Unter http://james.seng.cc/archives/000145.html gibts auch ein MT-Captcha-Plugin für beide Versionen. Aber das vom Lemming gefällt mir irgendwie besser …
Und Alp Uckan hat eine Liste von Captcha-Plugins für diverse Weblog-Systeme zusammengestellt: http://uckan.info/2005/01/04/captcha-plugins/
Mein gott, perl und php gemixed, was für ein Schrottcode und alle Fliegen freesen mal wieder die Scheisse… Hohlschädel…
Geht’s dir noch gut, Codewarrior? Hast du vielleicht eine bessere Alternative? Wir sind alle gespannt.
Bei meiner Captcha-Rundreise hatte ich mir auch dein Script angeguckt, ist in den Grundzügen relativ ähnlich zu meiner eigenen Captcha-Version (gdlib halt), allerdings habe ich da doch einen gravierenden Fehler entdeckt. (Oder was übersehen)
Du schreibst alle generierten Zahlencodes in deine captcha.txt und prüfst später, ob der Code dort vorhanden ist. Allerdings konnte ich keine Zeile entdecken, die bei erfolgreicher Code-Eingabe eben diesen auch wieder aus der captcha.txt löscht.
Theoretisch könnte ich jetzt 1 Mio. mal die captcha.php aufrufen, danach ist die captcha.txt dann reichlich gefüllt mit fast allen Codevarianten (es gibt ja nur 89999).
Jetzt könnte mit wenigen Versuchen wieder spammen, da ein großer Teil der Codevarianten in der captcha.txt vorhanden ist.
Eine mögliche Lösung: 6, 7 oder 8 stellige Codes in Kombination mit Timestamps zu den Codes, die z.B. nach einer gewissen Zeitspanne automatisch gelöscht werden.
Mit dieser Lösung bin ich zwar noch nicht ganz glücklich, aber vielleicht fällt mir noch was besseres ein, vielleicht eine Reloadsperre von einigen Sekunden für die catcha.php.
Mit dem eine Million mal aufrufen hast du natürlich recht.
Mit Timestamps oder noch längeren Captchas würde ich nicht arbeiten wollen.
Eine Möglichkeit wäre es doch noch eine Zahl an eine IP-Nummer zu binden. Jede IP-Nummer würde dann nur eine Zahl bekommen.
Setzt natürlich vorraus, dass die captcha.php nicht nur in die captcha.txt schreibt, sondern auch von ihr liest.
kan mir jemand ein gutes script nennen welches verschidene schriftarten benutzt und sich einfach einbauen läst?
help
Dies ust ein Test
>Mit Timestamps oder noch längeren Captchas
>würde ich nicht arbeiten wollen.
>
>Eine Möglichkeit wäre es doch noch eine Zahl
>an eine IP-Nummer zu binden. Jede IP-Nummer
>würde dann nur eine Zahl bekommen.
Ja, oder du löschst einfach nach erfolgreicher Codeeingabe den Code aus der captcha.txt
Gruß
David
Selbstverständlich wird die Zeile aus der Datei gelöscht, sonst kann ja jeder nach einem erfolgreichen lösen den Code wieder verwenden.
uztuzutu
Hi,
ich wollte das Script direkt in eine php datei einfügen, dass klappt auch, diese sendet dann weiter an eine andere php datei, die in die db schreibt.
Wie kann ich die abfrage für captcha erstellen???
Die txt datei kann man sich auch ganz sparen, wenn man aus der Zahl noch einen Hash genieriert und mit an das forum übergibt. einfach die benutzereingabe wieder hashen und die beiden Hashs vergleichen.
Den Hash natürlich noch mit einem schlüssel versehen. zb. hash(zahl+”geheim”)
Kann an leider nicht stäff, denn sonst hat der Angreifer mit dem im Form hinterlegten Hash ja sozusagen “ein Schlüsselpaar” um den Captcha zu knacken in der Hand. Er muss die Aufgabe ja dann nur 1x lösen und kann dann beliebig oft posten.
Beispiel: Aufgabe ist 900
Der Hash wird generiert aus “900geheim” und ist: NkbLtrZ==
Einmal gelöst kann der Angreifer mit 900 und NkbLtrZ==
ständig posten.
Ihr solltet einen md5 hash benutzen. Der wird auch von Linux benutzt um das Passwort in der /etc/shadow Datei zu verschlüsseln. Den MD5 einfach als PHP Session Variable hinterlegen. und dann die Eingabe mit md5() und der session variable vergleichen. Es ist sehr aufwendig MD5 zurück zu rechnen und dauert schon bei 3 Zeichen zu lange für einen bot. Die Zahl alleine solltet Ihr aber trotzdem nicht benutzen. Wenn man das mit einer Timeout funktion belegt, also die eingabe nach 30 minuten getätigt sein muss, dann ist das der perfekte Schutz.