Captcha als Spamschutz mit PHP erstellen
Author: Ing. Michael Fürst (office@bluegate.at)
Web: http://www.bluegate.at
Publiziert: Juli 2008
Bei diesem Tutorial handelt es sich um eine modifizierte (objektorientierte) Version des Tutorials auf stoppt-den-spam.info.
Einleitung und Hinweise
Um dieses Tutorial bzw. die fertigen Klassen nützen zu können, muss Ihr System folgende Anforderungen erfüllen:
- Apache Webserver mit >= PHP 4.0
- Installierte GDLib (http://www.boutell.com/gd/)
Download
Hier können Sie ein komplettes ZIP Archiv mit allen nötigen Klassen und Dateien herunterladen (ready to run):
Download bluegate Captcha (bluegateCaptcha_1_00.zip)
Wozu ein Captcha?
Häufig kommt es vor, dass sogenannte "Bots" Formulare von Websiten automatisiert ausfüllen (z.B. Registrierungs- oder Kontaktformulare). Das führt dazu, dass Sie als Seitenbetreiber keine realen Daten sondern nur maschinell erzeugten Spam erhalten. Dieses Problem tritt vor allem bei Open-Source Software auf, die weltweit sehr häufig eingesetzt wird (spezialisierte Bots).
Ein simpler Trick vermindert dieses Problem: Das Captcha
Um diesen Problem Herr zu werden bedient man sich der Tatsache, dass es einer Maschine sehr schwer fällt, Bilder zu deuten bzw. zu lesen. Man führt bei einem Webformular ein Bild mit relativ schwer lesbarer Schrift an und bittet den User den dort dargestellten Text in ein dafür vorgesehenes Textfeld einzugeben (Siehe Bild "Anwendungsbeispiel"). Stimmen die Daten im Feld mit jenen des Bildes überein, wird das Formular akzeptiert. Nachdem eine Maschine das Bild bzw. den enthaltenen Text nur sehr schwer auslesen kann, sind die Bots nahezu chancenlos.
Beispiel für ein Captcha:
Anwendungsbeispiel: Registrierung in einem Forum:
Captcha-Hintergrundbilder
Als Hintergrundbild verwenden wir PNG Dateien in einer Größe von 140x40 Pixel. Sie können beliebig viele Hintergründe für das Captcha selbstständig erstellen und in das Captcha integrieren (z.B.: mit Paint oder Photoshop). Achten Sie nur darauf, dass das Bild über mehrere "Störungen" (Körnung, Farbwechsel, Linien etc.) verfügt. Das erschwert das maschinelle Auslesen des Captchas. Bei der Download-Version (siehe Seitenanfang) sind bereits drei verschiedene Hintergrundbilder enthalten.
Captcha PHP Klasse (class.captcha.php)
Auf Basis der Captcha Funktion auf http://www.stoppt-den-spam.info habe ich eine Klasse entwickelt, die alle nötigen Funktionen zum Erstellen eines Captchas in PHP bereitstellt.
/* * Klasse "Captcha" * Erzeugt ein Objekt das ein Captcha für den Schutz vor automatisierten * Anmeldungen ausliefert * * Anforderungen: >= PHP 4, GD Lib * (c) 2008 bluegate communications, Ing. Michael Fürst * Web: http://www.bluegate.at * * Basierend auf der Captcha Entwicklung von stoppt-den-spam.info */ class Captcha { var $captchaText=''; var $bgImage=''; var $captchaFont='XFILES.TTF'; var $captchaFontSize=25; var $captchaTempImagePath = '/captcha/tempimages/'; var $minAngle = 0; var $maxAngle = 5; var $deleteTimeDiff = 10; function Captcha() { return true; } /* * Erzeugen eines Zufallstextes für das Captcha */ function setCaptchaText($textLength,$possibleSigns) { } } /* * Liefert den Captchatext zurück */ function getCaptchaText() { return $this->captchaText; } /* * Seed der Zufallszahlen */ function getSeed() { return (float) $sec + ((float) $usec * 100000); } /* * Festlegen des Hintergrundbildes, erwartet Array mit verschiedenen Elementen */ function setBgImage($imageArray) { } /* * Festlegen des Fonts */ function setFont($fontPath) { $this->captchaFont = $fontPath; } /* * Setzen der Schriftgröße */ function setFontSize($fontSize) { $this->captchaFontSize = $fontSize; } /* * Setzen des Neigungswinkels */ function setAngle($minAngle, $maxAngle) { $this->minAngle = $minAngle; $this->maxAngle = $maxAngle; } /* * Setzt den Pfad zum Temporären Captcha Image fest */ function setCaptchaTempImagePath($captchaTempImagePath) { $this->captchaTempImagePath = $captchaTempImagePath; } /* * Erstellt das Captcha Image und liefert es zurück */ function getCaptchaImage() { // Background Image definieren $img = ImageCreateFromPNG($_SERVER['DOCUMENT_ROOT'].$this->bgImage); // Schriftart und Farbe definieren $color = ImageColorAllocate($img, 0, 0, 0); $ttf = $_SERVER['DOCUMENT_ROOT'].$this->captchaFont; $ttfsize = $this->captchaFontSize; // Neigungswinkel & Abstände $t_y = 35; // Temp-Dateiname für die Ausgabe des Captchas // Text und BG Image mergen und PNG erstellen imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $this->captchaText); imagepng($img,$_SERVER['DOCUMENT_ROOT'].$this->captchaTempImagePath.$imageTempFilename); // PNG mit <img> wrappen $output = '<img src="'.$this->captchaTempImagePath.$imageTempFilename.'" />'; imagedestroy($img); return $output; } /* * Legt fest, nach wievielen Sekunden ein temporäres Captcha Image gelöscht werden darf */ function setDeleteTimeDifference($deleteTimeDiff) { $this->deleteTimeDiff = $deleteTimeDiff; } /* * Löscht die temporären Captcha Images * Gelöscht werden alle Images, die älter als 60 Sekunden sind. */ function cleanUpCaptchaTempImages() { $strDir = $_SERVER['DOCUMENT_ROOT'].$this->captchaTempImagePath; while ( false !== ( $strFile = $oDir->read () ) ) { { // Alter des Files (in Sekunden) ermitteln // File löschen, wenn es älter ist als $deleteTimeDiff Sekunden if ($fileAge > $this->deleteTimeDiff) { } } } $oDir->close(); } }
Erstellen des Captchas (Objektinstanz - index.php)
Mit nachfolgenden Zeilen können Sie nun einfach eine Instanz des Captcha-Objekts erstellen und das Captcha Image ausliefern. Weiters stehen eine Vielzahl von Konfigurationsmöglichkeiten zur Verfügung.
/* * bluegate "Captcha" * Erzeugt ein Captcha für den Schutz vor automatisierten Anmeldungen * * Anforderungen: >= PHP 4, GD Lib * (c) 2008 bluegate communications, Ing. Michael Fürst * Web: http://www.bluegate.at * * Basierend auf der Captcha Entwicklung von stoppt-den-spam.info */ /* Include required Classes and create Object*/ require('class.captcha.php'); $captcha = new Captcha(); /* Konfiguration */ $captcha->setCaptchaText(5,'ABCDEFGHJKLMNPRSTUVWXYZ23456789'); $captcha->setBgImage(array('/captcha/captcha_1.png','/captcha/captcha_2.png','/captcha/captcha_3.png')); $captcha->setFont('/captcha/XFILES.TTF'); $captcha->setFontSize(25); $captcha->setAngle(0, 3); $captcha->setCaptchaTempImagePath('/captcha/tempimages/'); $captcha->setDeleteTimeDifference(5); /* Image ausgeben */ /* Temporäre Files löschen */ $captcha->cleanUpCaptchaTempImages(); /* Ausgabe des Captcha als Plain Text (für Compare) */
Ein Zip Archiv mit allen nötigen Dateien können Sie am Beginn dieser Seite herunterladen.
Konfigurationsparameter & Methoden
- setCaptchaText($textLength,$possibleSigns)
Legt die Zeichenlänge sowie die erlaubten Zeichen im Captchatext fest - getCaptchaText()
Liefert den Captchatext im Plain Text Format zurück (für Vergleiche) - setBgImage($imageArray)
Erwartet ein Array mit Bildpfaden für die Hintergrundbilder des Captchas - setFont($fontPath)
Pfad zu einem TTF Font, aus dem der Text gebildet werden soll - setFontSize($fontSize)
Schriftgröße in Pixel - setAngle($minAngle, $maxAngle)
Minimaler und Maximaler Neigungswinkel des Textes in Grad - setCaptchaTempImagePath($captchaTempImagePath)
Pfad zu einem Verzeichnis, in dem die Temporären Captcha Bilddaten gespeichert werden können - getCaptchaImage()
Liefert das Captcha-Bild mit einem <img> Wrap zurück - setDeleteTimeDifference($deleteTimeDiff)
Legt die Zeitspanne in Sekunden fest, die ein temporäres Captcha-Bild mindestens alt sein muss, bevor es gelöscht werden kann - cleanUpCaptchaTempImages()
Leert den Order mit den temporären Captcha-Bildern (abhänging von der mittels setDeleteTimeDifference($deleteTimeDiff) gesetzten Alters-Zeitspanne )




















