PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Animierte CAPTCHAs und GIFs selbst erstellen

with 10 comments

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!

Written by Michael Kliewe

September 2nd, 2011 at 10:37 am

10 Responses to 'Animierte CAPTCHAs und GIFs selbst erstellen'

Subscribe to comments with RSS or TrackBack to 'Animierte CAPTCHAs und GIFs selbst erstellen'.

  1. 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

  2. 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

  3. 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

  4. 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

  5. @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

  6. @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

  7. 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

  8. @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

  9. 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

  10. @Fabian
    So lange Rapidshare genug Geld verdient, dürfte denen das ziemlich egal sein.

    Oliver

    3 Sep 11 at 19:35

Leave a Reply

You can add images to your comment by clicking here.