Hinweis: Diese Webseite dient als Archiv und wird nicht mehr aktualisiert. Aktuelle Artikel gibt es unter http://bwir.de

Eingabeformulare mit Captchas vor Spambots und Hackerattacken schützen

Captchas: Technische Hürde, die das automatisierte Ausfüllen und Absenden von Formularen erschwert

 

Dieser Artikel befindet sich im Archiv und wird nicht mehr aktualisiert. Informationen können ggf. veraltet, unvollständig oder fehlerhaft sein.

Spammer gehen immer agressiver vor, um ihre Werbebotschaften an die Leute zu bringen. Die neuste Masche: Bots durchsuchen das Internet nach Eingabemasken wie Kommentarboxen, Gästebücher etc. und verbreiten dort die Werbebotschaft. Zum Glück gibt es eine relativ einfache und wirksame Methode, dies zu verhindern. Der Schutz greift bei jeglichem automatisiertem Zugriff. Also kann man sich auch vor "Floodern" schützen, die tausende Einträge erzeugen, um Internetpräsenzen lahmzulegen.

Funktionsweise

Das Prinzip ist einfach. Der Nutzer muss Zahlen aus einer abgebildeten Grafik in ein nebenstehendes Feld abtippen. Stimmen die Zahlen überein, wird das Formular versandt.

Formularschutz im Einsatz

Bots o.ä. müssten zuerst das Bild einlesen und mittels OCR versuchen, die Zahlen zu erkennen. Das ist einerseits relativ unzuverlässig und benötigt außerdem viel Rechenleistung. Aufgrund dieser Nachteile gehe ich davon aus, dass gerade Spammer diesen Aufwand (noch) scheuen.

Technische Realisierung

Erzeugen der Grafik

Um eine Grafik zu erzeugen, greift man auf die GD-Bibliothek zurück, die in der Regel zusammen mit PHP auf dem Webserver installiert ist. Die kleine Einführung ist hierbei ganz hilfreich. Die folgende PHP-Datei kann dann wie ein Bild in HTML-Quellcode eingefügt werden. Um die Erkennung durch OCR-Programme zu erschweren, verwendet man geringe Kontraste und verschnörkelte Schrift. Eine Drehung erschwert die Erkennung zusätzlich.

  
<?php
header("Content-type: image/png");
 
$grafik = ImageCreate (100, 100); // Erzeugt ein 100x100px großes Bild
 
$hintergrundfarbe = ImageColorAllocate($grafik, 255, 0, 0); // Definiert die Farben
$schriftfarbe    = ImageColorAllocate($grafik, 0, 255, 0);  // in RGB-Schreibweise
 
$zahl = "12345"; // Auszugebende Zahl (Text ist natürlich auch möglich)
 
// Funktion, um Text mit der angegebenen Schriftart auszugeben. Die erste Zahl ist die Schriftgröße, die zweite die Drehung in Grad, und die dritte und vierte die X/Y-Koordinaten. Die Schriftart-Datei (hier: beech.ttf) muss sich am angegeben Ort (hier: im gleichen Verzeichnis) befinden
 
ImageTTFText ($grafik, 20, 30, 15, 70, $schriftfarbe, "/beech.ttf", $zahl);
 
ImagePNG($grafik); // Grafik erzeugen
imagedestroy($grafik); // Zwischenspeicher löschen
?>
 

Ausgabe des obigen Quelltextes

Ausgabe des obigen Quelltextes

Erzeugen der Prüfnummern

Für das Erzeugen einer zufälligen Prüfnummer benutzt man einfach die rand-Funktion von PHP. Allerdings ergibt sich ein Problem: Sowohl die PHP-Datei mit dem Formular, als auch die PHP-Datei, die das Bild erzeugt, muss diese Zufallszahl kennen. Am besten löst man dieses Problem mit einer Session. Im Internet kann man sich an vielen Stellen über die Funktionsweise einer solchen Session informieren. Für unseren Zweck reicht es aber, wenn man weiß, dass wir mittels einer Session von verschiedenen Dateien auf den Prüfcode zugreifen können, ein Außenstehender jedoch nicht.

Die folgende Datei enthält also ein Formular, schreibt eine Zufallsnummer in die Session und vergleicht bei einem abgesendeten Formular die Prüfnummer in der Session mit der eingegeben Prüfnummer. Die Formularüberprüfung muss natürlich den eigenen Anforderungen angepasst werden und kann auch auf eine andere Datei ausgelagert werden. Mittels der Session kann man schließlich von jeder Seite auf den Prüfcode zugreifen.

  
<?PHP
session_start(); // Session starten
 
// Überprüfung des Prüfcodes, falls das Formular ausgefüllt wurde
 
if (isset($_POST['submit'])){
if ($_POST['pruefcode'] == $_SESSION['code']){
 
echo "Der eingegebene Prüfcode ist richtig<br>";
// Aktionen, wenn Prüfcode richtig ist
 
}
 
else {
 
echo "Der eingegebene Prüfcode ist falsch<br>";
// Aktionen, wenn Prüfcode falsch ist
 
}
} // Ende der Formularüberprüfung
 
$_SESSION['code'] = rand(1000, 9999); // Prüfcode erzeugen und in der Session speichern
 
?>
 
<html>
<head>
<title>Formularseite</title>
</head>
<body>
<img src="code.php">
<form method="POST">
<input type="text" name="pruefcode"><br>
<input type="submit" name="submit">
</form>
 

Die Datei 'code.php', die für die Erzeugung des Bildes zuständig ist, wurde gegenüber den oberen Quelltext lediglich um das Auslesen des Prüfcodes aus der Session erweitert. Um die Sicherheit zusätzlich zu erhöhen, verändert sich Grad der Drehung zufällig. Der Kreativität sind beim Einbauen neuer Sicherheitsaspekte keine Grenzen gesetzt.

  
<?PHP
header("Content-type: image/png");
session_start(); // Startet die Session
 
$grafik = ImageCreate (100, 100); // Erzeugt ein 100x100px großes Bild
$hintergrundfarbe = ImageColorAllocate($grafik, 255, 0, 0); // Definiert die Farben
$schriftfarbe    = ImageColorAllocate($grafik, 0, 255, 0);  // in RGB-Schreibweise
ImageTTFText ($grafik, 20, rand(-30,30), 15, 70, $schriftfarbe, "/beech.ttf", $_SESSION['code']); // Code aus der Session in die Grafik schreiben
ImagePNG($grafik); // Grafik erzeugen
imagedestroy($grafik); // Zwischenspeicher löschen
?>