Captcha - Twoja ludzka natura

placio93

Witajcie!
W życiu każdego webmastera nadchodzi chwila, w której uświadamia sobie jak wielkim potencjalnym zagrożeniem są boty wysyłające automatyczne zapytania. Zazwyczaj mają na celu znacznie utrudnić przeciętnemu użytkownikowi dostęp do informacji, lub wymusić przerwę w świadczeniu niektórych usług(w skrócie: art. 268 §1 KK). Rozwiązanie tego problemu jest stosunkowo proste. Na pewno, przedzierając się przez czeluści internetu, napotkałeś/aś na swojej drodze captcha (zwane również testem trzeźwości). Jest to najczęściej obrazek z literami i cyframi, które należy przepisać w pole tekstowe. Wynika to z faktu iż wygenerowanie pary obrazek-tekst jest czynnością stosunkowo prostą obliczeniowo, w przeciwieństwie do odtwarzania tekstu na podstawie obrazka. Człowiek radzi sobie z tym jednak o wiele lepiej niż komputer.

Przedstawiam swój skrypt generujący captcha napisany w języku php:

<?php
# Autor: Grzegorz Płatek
# Skrypt dostępny za darmo.
# Zrzekam się prawa do roszczeń związanych z tym skryptem. Jebać ACTA, PIPA, SOPA.

define(fontdir,'fonts/'); # katalog z czcionkami
$chars=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
             'R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6',
             '7','8','9');
session_start();
header('Content-Type: image/png');
$img=imagecreate(300,100);
imagecolorallocate($img,192,192,192); #background
imagecolorallocate($img,255,0,0);     #r 1
imagecolorallocate($img,0,255,0);     #g 2
imagecolorallocate($img,0,0,255);     #b 3
imagecolorallocate($img,0,255,255);   #c 4
imagecolorallocate($img,255,0,255);   #m 5
imagecolorallocate($img,255,255,0);   #y 6
imagecolorallocate($img,0,0,0);       #k 7

for($x=0;$x<30;$x++){
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(5,15);
imagerectangle($img,$posx,$posy,$posx+$pa,$posy+$pa,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imagearc($img,$posx,$posy,$pa,$pa,0,0,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imageline($img,$posx,$posy,$posx+$pa,$posy+$pa,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imageline($img,$posx,$posy,$posx+$pa,$posy-$pa,rand(1,7));
}
$dir = opendir(fontdir);
while(false !== ($file = readdir($dir)))
  if($file != '.' && $file != '..') 
    $fonts[]=$file;
for($x=0;$x<6;$x++)
 {
 $c=$chars[rand(0,count($chars)-1)];
 $captcha.=$c;
 imagettftext($img, rand(50,60),rand(-15,15),$x*50+rand(-5,10),80,rand(1,7),fontdir.$fonts[rand(0,count($fonts)-1)],$c);
 }
$_SESSION["captcha"]=$captcha; 
for($x=0;$x<10;$x++){
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(5,15);
imagerectangle($img,$posx,$posy,$posx+$pa,$posy+$pa,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imagearc($img,$posx,$posy,$pa,$pa,0,0,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imageline($img,$posx,$posy,$posx+$pa,$posy+$pa,rand(1,7));
$posx=rand(0,295);
$posy=rand(0,95);
$pa=rand(10,15);
imageline($img,$posx,$posy,$posx+$pa,$posy-$pa,rand(1,7));
}
imagepng($img);
?>

W czym mój skrypt jest lepszy od innych? korzysta z wielu czcionek na raz.
aby skrypt działał poprawnie w szóstej linii musimy podać ścieżkę dostępu do katalogu z czcionkami w formacie TrueType Font (w moim wypadku jest to katalog fonts). Im ich więcej tym lepiej, gdyż trudniej będzie zaznajomić potencjalnego bota ze wszystkimi czcionkami.

poprawność przepisanego kodu sprawdzamy przez porównanie go z tym zapisanym w zmiennej sesji.

if($_POST["captcha"]==$_SESSION["captcha"] && $_SESSION["captcha"])
 { # dodatkowy warunek $_SESSION["captcha"] sprawdza czy captcha została rzeczywiście wygenerowana
 #kod poprawny
 $_SESSION["captcha"]=''; #zapobiega wielokrotnemu użyciu kodu captcha
 }
else
 {
 #kod niepoprawny
 }

a wygenerowana captcha wygląda tak:
capcha.png

0 komentarzy