Не для похвалы:
реализация такая:
use Digest::MD5;
use GD;
$datadir="/home/....";
print "Content-type: image/jpeg\\n\\n";
$image = new GD::Image(50,50);
$white = $image->colorAllocate(255,255,255);
$black = $image->colorAllocate(0,0,0);
$image->rectangle(0,0,50,50,$black);
$number=int rand 3333;
$image->fill(49,49,$black);
$image->string(gdGiantFont,5,15,"$number",$white);
binmode STDOUT;
#создаем имя файликов картинки и содержащий цифру
$salt=Digest::MD5->new;
$string=time().$$;
$hash=$salt->add($string);
$id=$hash->hexdigest;
open(FILE,">$datadir/$id")||die;
print FILE $number;
close(FILE);
open(FILE,">$datadir/$id.jpg")||die;
print FILE $image->jpeg;
close(FILE);
#Показываем картинку и скрытое полу с id по которому можно сравнить введенный номер.
print "
|
";
print "
В нижеследующее поле введите номер, который Вы видите на картинке. |
";
print "
";
print "
Номер |
";
#Остально обрабатывает скрипт авторизации...
Толко не забудте затереть созданные файлы - папка разбухнет