Geschrieben von bauschi am 01.06.2004, 17:53

Anti-Script-Code mit PHP

Folgendes Problem:
Ihr habt ein kleines MMOG (Online-Browser-Spiel), oder irgendetwas mit einem Login.
Und nun wollt ihr verhindern, dass der Benutzer einfach einen Bot (Künstliche Intelligenz) für sich arbeiten lässt, indem sich der Bot automatisch einloggt und Operationen ausführt.
Dieses Problem lässt sich mit einem Anti-Script-Code verhindern. Mit einem Script generiert man einfach ein Bild mit Zahlen, sodass der Bot diese nicht lesen kann.
Nun wird der Benutzer aufgefordert die Zahlen einzutippen, dass Menschliche Gehirn erlaubt es solche Zahlen zu lesen, ein Computer schafft dies fast gar nicht.
Als Mittel nehmen wir PHP mit Sessions und image-Funktionen.

Neue php Datei "gen.php"

Vor dem PHP KEIN Leerzeichen oder änliches!
<?php

session_start(); //Session starten!
header ("Content-type: image/png");
srand((double)microtime()*10000000); //Zufallszahlen generieren

$X = 75; //Größe des Bildes (X,Y)
$Y = 30;

$Bild = imagecreate($X,$Y);

$farbe_body = imagecolorallocate($Bild,rand(0,50),rand(0,50),rand(0,50)); //Hintergrundfarbe ist Zufall, jedoch nie zu dunkel oder zu hell
$farbe_b = imagecolorallocate($Bild,255,255,255); //Schriftfarbe ist immer weiß
$gencode = "";

for($i=0; $i<=60; $i+=15){ //Zahlen werden generiert und hintereinander hingeschrieben
$Akt = rand(0,9);
$gencode .= $Akt; //Zufallszahl wird zur gesamten Zahl hinzugefügt
ImageTTFText ($Bild, 20, 0, $i, 25, $farbe_b, "comic.ttf", $Akt); //! Wir nehmen als Schriftart Comic sans ms, jedoch muss man die schriftart in den ordner des scripts kopieren!!!
}

for($i=0; $i<=30; $i+=4){ //Horizontale Linien, damit das Bild für den PC noch unkenntlicher ist
ImageLine($Bild, 0, $i, $X, $i, $farbe_b);
}

for($i=0; $i<=100; $i+=4){ //VertikaleLinien, damit das Bild für den PC noch unkenntlicher ist
ImageLine($Bild, $i, 0, $i, $Y, $farbe_b);
}

$_SESSION['gencode'] = $gencode; //Der generierte Code wird als Session-Variable definiert
imagepng($Bild); //Das Bild wird generiert

?>

Nun der Login:

<html>
<body>

<form action="next.php" method="post">
<img src="gen.php"><br> <!-- Generiertes Bild einfügen, ist bei jedem Aktualisieren oder neubetreten der Seite neu
<input type="text" name="bildcode"><br>

<!-- Hier können natürlich dann auch die weiteren Textfelder für Benutzername und Passwort hin -->

<input type="submit" value="Weiter">
</form>

</body>
</html>

Die nächste Seite zur Login-Bestätigung:

<?php

session_start();

?>

<html>
<body>

<?php

if($anticode == $_SESSION['gencode']){ //Überprüfe, ob der eingegebene Code mit dem in der Session-Variable definierten Code übereinstimmt
echo "drin!";
}else{
echo "falscher antiscriptcode!";
} //Hier können weitere Abfragen auf Benutzername und Passwort stehen

?>
</body>

</html>

Das Prinzip:

Es wird, ein für den PC unkenntliches, Bild (gen.php) generiert, worauf Zahlen stehen, die der Benutzer eintippen muss.
Die Zahlenkombination auf dem Bild, steht NIRGENDSWO im Quelltext, oder wo der Bot die Zahlen auslesen könnte.
Sie steht nur auf dem Bild und auf dem Server, als Session Variable, wo der Bot unmöglich herankommt.
Wenn der Benutzer sich einloggt, wird die eingetippte Zahl mit der Session-Variable verglichen.

Fragen bitte per PM

Bewertung Anzahl
6
50,0 %
2 Bewertungen
5
25,0 %
1 Bewertungen
3
25,0 %
1 Bewertungen