Captchas erstellen
Exzellenter ArtikelAnzeige 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
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.
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
Info
Das dient nur als einfaches Beispiel und ist vermutlich relativ schnell knackbar.