Captchas erstellen

Exzellenter Artikel

Anzeige Hier werben

Was ist ein Captcha

Captchas sind kleine Bilder in Formularen, die verhindern sollen, dass Bots das Formular abschicken können.
Dazu enthalten sie meist einen Code aus Buchstaben, Zahlen und Zeichen oder sogar eine Rechnung. Dies ist für Maschinen schwer oder gar nicht lesbar.
Der Code oder die Rechnung wird per Zufall generiert und bei dem Absenden des Formulars mit der Benutzereingabe verglichen.

Captchas sind nicht alles

Ein Captcha in einem Formular bedeutet nicht, dass es vollkommen sicher ist vor Bots.
Sie bieten aber dennoch einen guten Schutz um z.B. ungewollte Gästebucheinträge zu vermeiden.

Beispiele

Bild zu Captchas erstellen

Falls jemand noch welche hat, kann er mir diese gerne zuschicken, ich füge sie dann hier hinzu

Wie ihr seht, gibt es verschiedene Arten, eine Art die nun nicht dabei ist, ist eine Rechnung.

Das Vorgehen

Ihr müsst euch als erstes überlegen wie ein Captcha funktionieren muss.
Der Code darf nicht immer der selbe sein, dieser muss per Zufall erstellt werden.
Die Primäre Frage ist, wie überprüfe ich die Eingabe vom Benutzer mit auf dem Bild stehenden Code?

Da der Benutzer den generierten Code nicht ändern darf, darf man keine Cookies verwenden, diese können per JavaScript einfach geändert werden!
Zum Glück gibt es Sessions, diese werden auf dem Server gespeichert und über die SessionID überprüft.
In dieser Session kann man dann den generierten Code abspeichern und ihn später mit der Eingabe des Benutzers überprüfen.

Der Code

Dieser Code ist als ganze Datei zu sehen.

 
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
session_start(); // Session initialisieren

/**
 * generate captcha
 *
 * @param   _SESSIONNAME        session name
 * @return  void
 */
function generateCaptcha($_SESSIONNAME) {
    
    if(trim($_SESSIONNAME) == '') // Überprüfen ob der Sessionname leer ist
        die('Sessionname ist leer!'); // Script beenden und String ausgeben
    
    $font = './captcha.ttf'; // TTF Schriftart für Captcha
    
    $image = imagecreate(125, 30); // Bild erstellen mit 125 Pixel Breite und 30 Pixel Höhe
    imagecolorallocate($image, 255, 255, 255); // Bild weis färben, RGB
    
    $left = 5; // Initialwert, von links 5 Pixel
    $signs = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789';
        // Alle Buchstaben und Zahlen
    $string = ''; // Der später per Zufall generierte Code
    
    for($i = 1;$i <= 6;$i++) // 6 Zeichen
    {
        $sign = $signs{rand(0, strlen($signs) - 1)};
                    /*
                        Zufälliges Zeichen aus den oben aufgelisteten
                        strlen($signs) = Zählen aller Zeichen
                        rand = Zufällig zwischen 0 und der Länge der Zeichen - 1
                        
                        Grund für diese Rechnung:
                        Mit den Geschweiften Klammern kann man auf ein Zeichen zugreifen
                        allerdings fängt man dort genauso wie im Array mit 0 an zu zählen
                        
                    */
        $string .= $sign; // Das Zeichen an den gesamten Code anhängen
        imagettftext($image, 20, rand(-10, 10), $left + (($i == 1?5:15) * $i), 25, imagecolorallocate($image, 200, 200, 200), $font, $sign);
                // Das gerade herausgesuchte Zeichen dem Bild hinzufügen
        imagettftext($image, 16, rand(-15, 15), $left + (($i == 1?5:15) * $i), 25, imagecolorallocate($image, 69, 103, 137), $font, $sign);
                // Das Zeichen noch einmal hinzufügen, damit es für einen Bot nicht zu leicht lesbar ist
    }
    
    $_SESSION[$_SESSIONNAME] = $string; // Den Code in die Session mit dem Sessionname speichern für die Überprüfung
    
    header("Content-type: image/png"); // Header für ein PNG Bild setzen
    imagepng($image); // Ausgaben des Bildes
    imagedestroy($image); // Bild zerstören
    
}

$sessionName = 'captchacode'; // Sessionname

if(isset($_GET['captcha']))
{
    generateCaptcha($sessionName); // Funktionsaufruf, erste Parameter ist der Name für die Session
    exit(); // Script beenden, es soll keine weitere Ausgabe stattfinden
}

if(isset($_POST['check'])) // Wurde das Formular abgeschickt
{
    if($_SESSION[$sessionName] == trim($_POST['captcha'])) // Stimmt die Eingabe mit dem Code überein
        echo "Richtig";
    else
        echo "Falsch";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <fieldset>
        <label for="captcha">
            Captcha
        </label>
        <input type="text" name="captcha" id="captcha" />
        <img src="<?php echo $_SERVER['PHP_SELF']; ?>?captcha" alt="" />
        <button type="submit" name="check">Überprüfen</button>
    </fieldset>
</form>

Es kann natürlich jede gewünschte Variante erstellt werden.
Ich habe hier lediglich die häufigste genommen.

Ergebnis

Bild zu Captchas erstellen
EGeneriertes Captcha des obigen Codes
(Schriftart: Agency FB Fett)

Info

Das dient nur als einfaches Beispiel und ist vermutlich relativ schnell knackbar.

hat Erfahrungen im Webentwicklungs-Bereich seit mehr als 8 Jahren. Arbeitet als Webentwickler bei einem Verlag in Stuttgart.
Profilseite betrachten

Kommentare: Captchas erstellen

Neuen Kommentar schreiben
Mathe-Captcha
Beantworten

Sind Mathe-Captcha in Textform eventuell nicht benutzerfreundlicher? Gerade was die Lesbarkeit betrifft.

Bei einigen Captchas habe ich Probleme die überhaupt zu erkennen und nein ich bin nicht blind, nur manche Leute sind anscheinend der Meinung das Captcha so zu verunstalten, dass man nichts mehr wirklich erkennen kann.

Für Drupal setze ich derzeit das Mathe-Captcha ein, die paar Zahlen die man rechnen muss dürfte kein Problem darstellen.

Alexander Haack am 20.11.2010 um 23:00
Re: Mathe-Captcha
Beantworten

Wies jeder lieber mag. Mal abgesehen davon, dass der Artikel über 3 Jahr alt ist.

Fabian "q-rios" Krause-Willenberg am 20.11.2010 um 23:05
Re: Mathe-Captcha
Beantworten

Das stimmt, da gebe ich dir recht ;-)

Alexander Haack am 20.11.2010 um 23:15
Captcha erklaerung
Beantworten

Waere gut wenn du am Anfang des Artikel erklaeren koenntest, was ein captcha ist. So in ca. 5 Saetzen.

Thomas H am 04.11.2007 um 22:01
Captchas lösen durch Trojaner
Jan Pieper am 04.11.2007 um 22:01