Captchas erstellen

Exzellenter Artikel
von Benutzer gelöscht | 0 | 26645 Aufrufe

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.

Über den Autor: Benutzer gelöscht
hat keine Beschreibung angegeben. Eine Beschreibung kann man unter dem Punkt "Profil bearbeiten" im Kontrollzentrum eintragen.
Profilseite betrachten