Php

Sicherheitscode-Abfrage (Php Tutorial)

Tutorial erstellt von Malte, letzte Änderung am 04.07.2007

So, Ladies and Gentleman, jeder kennt es. Man baut sich ein Gästebuch auf seine Seite ein, und schon kommt Spam wie "free blabla, look here: blabla" etc. Das sind sogenannte Bots, die automatisch Einträge in euer Gästebuch machen, um andere Leute auf ihr Angebot aufmerksam zu machen. Schützen kann man sich dagegen, indem man jeden Poster vorher eine kleine Zahlenreihenfolge abtippen lässt, die Sicherheitshalber dynamisch und zufällig in einem kleinen PHP-Bild ausgegeben wird. Here we go!

Wir benutzen natürlich MySQL. Ein User betritt ihre Website und das Bildchen erscheint. Wir unterscheiden hier 2 Sachen:
3 zufällige Zahlen, die abzutippen sind
und
ein zufällig generierter Code, der die Zahlen "identifiziert". Dieser Code wird zusammen mit der dazugehörigen Zahl in der MySQL-Tabelle gespeichert. Zusätzlich wird beim Absenden des Formulars dieser Code mithilfe eines hidden-Feldes übermittelt. Das eingeben des Codes anstatt der 3 Ziffern soll allerdings nichts bringen, man muss die 3 Zahlen eingeben, um Zutritt zu bekommen.

Die Tabellenstruktur gebe ich hier mal vor:

Code:
CREATE TABLE `img` (
`code` char(3) NOT NULL default '',
`verify` varchar(6) NOT NULL default ''
) TYPE=MyISAM;


Die Datei "config.php" stellt in jedem Dokument eine MySQL-Verbindung her. Ihr Inhalt lautet so:

Code:
<?
$host = "localhost"; // MySQL-Host eintragen
$user = "root"; // MySQL-Benuztername eintragen
$pass = ""; // MySQL-Passwort eintragen
$database = "data"; // MySQL-Datenbank eintragen

$dz = mysql_connect($host, $user, $pass);
mysql_select_db($database, $dz);
?>


Der Code für die Ausgabe des Bildes lautet so:

Code:
<?
include("config.php");
function random_string($chars = 6)
{
  $s = uniqid(mt_rand(), true);
  $s = sha1($s);
  $s = substr($s, mt_rand(0, 40-$chars), $chars);
  return $s;
}
$verify = random_string(6);
$zahl = rand(1,9).rand(1,9).rand(1,9);
mysql_query("INSERT INTO `img` VALUES ('$zahl','$verify')");

print '

<img src="rand.php?a='.$verify.'" border="0" alt="Bitte abtippen!">
<input type="text" name="code" />
<input type="hidden" name="verify" value="'.$verify.'" />
';
?>


Hier passiert folgendes:

Erst wird der "Verify" generiert. Das ist eine zufällige Alphanumerische Zeichenfolge. Dies wird zusammen mit der wirklichen Zahl in ein MySQL-Feld geschrieben.
Hinterher wird die Datei "rand.php", die das Bild ausgeben soll, mit dem GET-Paramenter des Verifys aufgerufen. Sie muss diesen also nur noch entgegennehmen und die dazugehörige Zahl aus dem MySQL-Feld auslesen.

Der Code der Datei "rand.php sieht folgendermaßen aus:

Code:
<?
$a = $_GET['a'];
include("config.php");

$s = mysql_query("SELECT * FROM `img` WHERE `verify` = '$a'");
$code = mysql_fetch_assoc($s);

$zahl = $code['code'];

header("Content-type: image/png");
$image = imagecreate(70, 25);
$red = imagecolorallocate($image, 255,0,0);
$blue = imagecolorallocate($image, 0,0,255);
$green = imagecolorallocate($image, 0,255,0);
imageline($image, 0, 0, 70, 25, $green);
imageline($image, 70, 0, 0, 25, $blue);
imageline($image, 70, 12, 0, 12, $green);
imagestring($image, 10, 22, 5, "$zahl", $blue);
imagepng($image);
?>


Die Variable $a enthält hier den Verify. Wir lesen die dazugehörige Zahl mit
Code:

$s = mysql_query("SELECT * FROM `img` WHERE `verify` = '$a'");
$code = mysql_fetch_assoc($s);

$zahl = $code['code'];


aus. Was danach folgt, ist nur noch das Image-generieren. Es werden zusätzlich noch ein paar grüne und blaue Striche über das Bild mit dem roten Hintergrund gemacht, um das Lesen ETWAS zu erschweren.
Der Code ist noch für jeden normalen Menschen lesbar, denn wenn er das nicht ist, macht die keinen positiven Eindruck. Natürlich muss für das ganze die PHP-IMAGE unterstützung für PNG-Bilder installiert sein, was sie z.B. bei XAMPP standartgemäß auch ist.

Als letztes fehlt uns nurnoch die Überprüfung, ob der Code richtig ist.

Code:
<?
include("config.php");
$code = $_POST['code'];
$verify = $_POST['verify'];

$s = mysql_query("SELECT * FROM `img` WHERE `verify` = '$verify'");
$fetch = mysql_fetch_assoc($s);

If ($fetch['code'] != $code) {
print("Sie haben den Sicherheitscode falsch abgetippt!");
mysql_query("DELETE FROM `img` WHERE `verify` = '$verify'");
die("");
} Else {
mysql_query("DELETE FROM `img` WHERE `verify` = '$verify'");
}
?>


Hier wird der Verify aus dem Hidden-Feld und der eingegebene Code geholt. Anschließend wird durch den Verify der richtige Code aus der MySQL-Tabelle geholt.
Es muss nur noch verglichen werden, ob der eingegebene und der richtige Code übereinstimmen. Wenn dies nicht der Fall ist, dann wird eine Fehlermeldung ausgegeben. In beiden Fällen wird die MySQL-Tabelle ein wenig erleichtert, da wir den Code und den Verify aus ihr löschen, um sie nicht zuzumüllen.


So, das war es eigentlich auch schon. Hoffentlich ist es für euch von Nutzen!


>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!

Impressum / Datenschutzerklärung          © der-Webdesigner.net 2002 - 2008           top ▲