Captcha-Bild dynamisch erstellen

Captchas, diese kleinen Bildchen mit Buchstaben, Zahlen oder sonstigen Zeichen drauf, kennt man ja mittlerweile. Sie sollen dazu dienen Robots vom automatischen Ausfüllen von Formularen abzuhalten, da davon ausgegangen wird, dass diese die Bilder nicht entziffern können. Dass das jedoch mittlerweile nicht mehr der Fall ist und Bots durchaus in der Lage sind Captchas zu lösen, ist auch bekannt. Meine Idee war daher ein Captcha zu bauen, das einerseits kein "sinnvolles" Wort darstellt, also nur eine Aneinanderreihung von zufälligen Buchstaben, Zahlen und Sonderzeichen ist, und andererseits trotzdem für Menschen zu lesen ist, für Bots aber nur schwer. Dabei ist mir aufgefallen, dass die meisten Captcha-lösenden-Bots Probleme mit Sonderzeichen haben und nicht unterscheiden können, zwischen "richtigen" und "falschen" Buchstaben. Deshalb verwendet mein Captcha Sonderzeichen und schreibt außerdem zufällige graue Buchstaben auf das Bild. Bots sollten diese als Teil des Codes interpretieren und werden das Captcha somit falsch ausfüllen, menschlichen Benutzern kann man hingegen die Anweisung geben nur bunte Buchstaben einzutragen. Ich werde hier nur beschreiben, wie man das jeweilige Captcha-Bild erstellt, wie der Code festgelegt bzw. ausgewertet wird, überlasse ich dir. Hier im Beispiel wird er über $_SESSION['captcha'] weitergegeben.

Code:
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:
<?
// multiple fonts are read in an array, they are located in 'fonts'
$dir='font';
$handle=opendir($dir);
while(
false!==($file=readdir($handle)))
{
if(
is_file($dir.'/'.$file) && $file!='index.php')
{
$fonts[]=$dir.'/'.$file;
}
}
closedir($handle);
// if a captcha-word is set
if(isset($_SESSION['captcha']))
{
// start random-generator
srand ((double)microtime()*1000000);
// create image with size 100x30
$im = @imagecreatetruecolor (10030) or die("Error!");
$background_color ImageColorAllocate ($im255255255); // background white
$background_text_colorimagecolorallocate($im,130,130,130); // color of false signs is grey
imagefill($im,0,0,$background_color);// fill image with white background
// false signs
$string=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o''p','q','r','s','t','u','v','w','x','y','z','0','1''2','3','4','5','6','7','8','9');
for(
$r=0;$r<=2;$r++) // write false signs in y-direction
{
for(
$t=0;$t<=5;$t++) // write false signs in x-direction
{
imagettftext($imrand(12,14), rand(-45,45), 15*$t+515*$r+10$background_text_color$fonts[mt_rand(0,count($fonts)-1)], $string[mt_rand(0,count($string)-1)]);
}
}
// write captcha-word
for($i=0;$i<=strlen($_SESSION['captcha']);$i++)
{
$text_color ImageColorAllocate ($imrand(0,50), rand(0,50), rand(0,50)); // get a new color for every sign
// write sign to image
imagettftext($imrand(12,14), rand(-25,25), 17*$i+12rand(15,22), $text_color$fonts[mt_rand(0,count($fonts)-1)], substr($_SESSION['captcha'],$i,1));
}
header ("Content-type: image/png");
ImagePNG($im); // output of image
exit();
}else{ 
// error image
$im = @ImageCreate (10025) or die("Error!");
$background_color ImageColorAllocate ($im255255255);
$text_color ImageColorAllocate ($im25500);
ImageString($im575'Error!'$text_color);
header ("Content-type: image/png");
ImagePNG($im);
}
?>