Animierte CAPTCHAs und GIFs selbst erstellen
Da ich noch nie mit PHP ein animiertes GIF erstellt habe wollte ich das mal testen. Um auch etwas halbwegs sinnvolles zu tun habe ich eine Klasse erstellt die animierte CAPTCHAs erstellen kann.
Bei animierten GIFs und PHP gibt es im Prinzip 2 Lösungen: Man nutzt Imagick, oder man baut das GIF-Format binär nach. Für letzteres gibt es bereits die Klasse GIFEncoder, die ich auch hier nutze. Die GD-Funktionen von PHP bieten leider keine Möglichkeit (mehr), animierte GIFs zu erstellen.
Das Projekt AnimatedCaptcha liegt auf Github. Man übergibt der Klasse eine Zeichenfolge, stellt ein paar Parameter ein und erhält als Ergebnis ein animiertes GIF. Ich habe ein Plugin-System eingebaut, sodass weitere Plugins schnell erstellt werden können. Ich habe bereits 3 angelegt:
MovingRectangle: ![]()
Snow: ![]()
RollingBall: ![]()
Diese 3 Plugins haben jeweils weniger als 40 Zeilen Code. Hier 2 Beispiele der Benutzung:
<?php
// Example for the MovingRectangle Plugin
$pluginOptions = array(
'text' => 'PHPGangsta',
'textSize' => 3,
'textColor' => '000000',
'backgroundColor' => 'ffffff',
'foregroundColor' => '000000',
'windowWidth' => 30,
'pixelPerFrame' => 2,
);
require_once 'AnimatedCaptcha.php';
$animatedCaptcha = new AnimatedCaptcha();
$animatedCaptcha->setMillisecondsBetweenFrames(10)
->setPluginName('MovingRectangle')
->setPluginOptions($pluginOptions)
->render()
->outputRenderedImage();
Und Nummer 2:
<?php
// Example for the Snow Plugin
$pluginOptions = array(
'text' => 'PHPGangsta',
'textSize' => 4,
'textColor' => '000000',
'backgroundColor' => 'ffffff',
'foregroundColor' => '000000',
'strength' => 20,
);
require_once 'AnimatedCaptcha.php';
$animatedCaptcha = new AnimatedCaptcha();
$animatedCaptcha->setMillisecondsBetweenFrames(10)
->setPluginName('Snow')
->setPluginOptions($pluginOptions)
->render()
->outputRenderedImage();
Aktuell habe ich mindestens 3 Dinge auf der Liste die man noch erweitern könnte:
- TTF-Schriftarten wären nett um unterschiedlichere Ausgaben zu bekommen
- Eventuell als Alternative Imagick, das könnte schneller/besser sein als die GIFEncoder Lösung, muß man ausprobieren
- mehr Plugins!



Mal wieder Captchas, die ein Bot leichter lesen kann als ein Mensch:
Einmal alle Frames mit bitwise AND verknüpft und anschließend genügt eine simple Texterkennung, da sämtliches Rauschen entfernt ist.
Immer noch ein empfehlenswerter Artikel, dazu wie man Spam ohne Captchas effektiver vorbeugt: http://nedbatchelder.com/text/stopbots.html
Fabian
2 Sep. 11 at 10:44
Ich denke, weder animierte Gifs noch Captchas sind wirklich erstrebenswert 🙂
Die Akismet-API wäre auch in Betracht zu ziehen:
http://akismet.com/development/api/
sprain
2 Sep. 11 at 10:51
Aus Usabilitysicht ist das natürlich für’n Pobbes, aber gibt es sowas eigentlich für Flash? Gifs sehen irgendwie büüüaaaah aus.
Oliver
2 Sep. 11 at 12:11
Automatisiertes Captcha-Lösen wird doch heutzutage mit Hilfe von Menschen gemacht (via Relay auf Fake-Porn-Sites oder Software, Niedriglohn, …) – und denen ist es doch egal, wenn es sich bewegt.
ilja
2 Sep. 11 at 12:46
@Fabian: Ich bin auch ein großer Fan von alternativen Bot-Erkennungsmethoden wie in deinem Link geschildert. Denn in ganz vielen Fällen sind die deutlich einfacher in der Benutzung und Umsetzung und können sehr gute Resultate bringen.
Das Problem ist aber vermutlich das sie nur bei nicht gezielten Bots gut wirken. Also einer der einfach das ganze Netzt wahllos nach Kommentar- und Kontaktformularen abgrast.
Hat es aber ein Hacker gezielt auf ein Formular abgesehen und er entwickelt sein Script genau für dieses, können die alternativen Methoden recht leicht übersprungen werden.
Für kleine Seiten die wohl nie gezielt angegriffen werden würde ich also immer die alternativen Methoden bevorzugen, betreibe ich aber ein Google, Yahoo o.ä. und werde gezielt angegriffen reicht das wohl leider nicht.
Oder hat/kennt wer Alternativen zu Captchas die auch eine gezielte Attacke aushalten müssten?
Florian Heinze
2 Sep. 11 at 18:49
@sprain: Ich gehe mal davon aus, das wir hier von professionellen Webauftritten sprechen. Akismet würde ich dann nicht direkt nutzen, denn die Daten wandern meines Wissens nach über den großen Teich. Entsprechend muss auch das in den Datenschutzerklärungen geschrieben werden. Ich halte das, genauso wie Google Analytics und diese Facebook „gefällt mir“ Buttons für fragwürdig.
Sven
2 Sep. 11 at 20:16
interessante Lösung, und bei weitem lesbarer als viele Captchas, denen ich bisher über den Weg gelaufen bin.
Das bewegte Captchas leichter von Bots zu entschlüsseln sind würde ich so pauschal nicht sagen. Das hängt schon sehr von der Machart ab. Zudem ermöglichen die Bewegten Captchas das leichtere ausnutzen von Sinnestäuschungen, die maschinell nur sehr schwer Wahrnehmbar sind
Flyingmana
3 Sep. 11 at 04:10
@flyingmama: sicherlich, pauschal lässt sich das nicht sagen, ich bezog mich konkret auf die vorgestellte Bibliothek.
@Florian Heinze: Mich würde mal interessieren, wie RapidShare mit der Problematik mittlerweile umgeht, deren unsägliche Captchas gibt es ja zum Glück nicht mehr. Weiß da jemand mehr?
Fabian
3 Sep. 11 at 10:12
Natürlich sind die Beispiel-CAPTCHAs hier nicht sehr sicher und keine Revolution, es wäre natürlich besser Farben, andere Schriftarten, hin- und herhüpfende Zeichen zu verwenden usw, es war einfach nur mein erster Test mit animierten GIFs und wenigen Zeilen Code.
Ihr habt Recht wenn ihr sagt dass gegen automatisierten Spam Dinge wie per CSS ausgeblendete Textfelder oder Anti-Spam-Dienste evtl. besser geeignet sind, denn CAPTCHAs sind lästig für den User, vor allem wenn sie schwer erkennbar sind.
Die IP-Adresse kann man natürlich nutzen um das Problem zusätzlich zu beschränken, aber auch dort gibt es dann False-Positives und Bot-Netze haben Millionen verschiedener IP-Adressen zur Verfügung, hilft also auch nicht. Wahrscheinlich kommt man aktuell mit einer Kombination am weitesten, die perfekte Lösung gibt es meines Wissens noch nicht.
Michael Kliewe
3 Sep. 11 at 10:58
@Fabian
So lange Rapidshare genug Geld verdient, dürfte denen das ziemlich egal sein.
Oliver
3 Sep. 11 at 19:35
Der Hinweis von Fabian zu den Frames ist wirklich der Knackpunkt: Wenn man alle Einzelbilder mit bitwise AND verknüpft, bleibt oft nur noch der Text übrig, und ein einfacher OCR-Schritt reicht. Genau deshalb lohnt es sich, die Bewegung nicht als Sicherheitsmerkmal zu sehen, sondern als kleine visuelle Spielerei – dein Plugin-System mit MovingRectangle und Snow macht das ja sehr elegant in unter 40 Zeilen. Wer statt CAPTCHA lieber direkt mit Gesten und Bewegung im Browser arbeitet, findet bei HandSynth Akkorde per Handgeste einen ähnlich spielerischen Ansatz: Webcam-Tracking läuft lokal, die linke Hand steuert Akkorde, die rechte Lautstärke und Helligkeit, ohne Installation oder Anmeldung. Für die TTF-Erweiterung wäre übrigens imagick mit imagickdraw eine gute Alternative, gerade bei vielen Frames spart das Rechenzeit.
Jonas Feldmann
21 Okt. 26 at 14:51
Der Ansatz mit GIFEncoder ist gerade deshalb interessant, weil die GD-Funktionen hier an ihre Grenzen stoßen. Beim Namen fortnite sprite musste ich an die allgemeinere Frage denken, wie sich einzelne Bilder in PHP zu einer Animation zusammensetzen lassen. Das Plugin-System macht AnimatedCaptcha dafür als Beispiel spannend. Mich würde interessieren, wie stark zusätzliche Frames die Dateigröße erhöhen und ob die Bewegung bei längeren Zeichenfolgen die Lesbarkeit des CAPTCHAs beeinträchtigt.
Nancy Newman
21 Okt. 26 at 21:55