Home > Archiwum, PHP > Własny skrypt captcha w PHP

Własny skrypt captcha w PHP

Jak inne wpisy w kategorii „Archiwalne” zostały przeze mnie mucone ładnych kilka lat temu :-D więc, niektóre rzeczy mogą być przedawnione.

Po pewnym czasie od publikacji tego kodu (jeszcze na moim wcześniejszym blogu) dochodziły do mnie linki od znajomych gdzie wykorzystują moją captche, jest m.in. na napiprojekt.pl (http://www.napiprojekt.pl/?dz=6), tyle, że gdy napisałem do nich czy umieszczą linka skąd pochodzi (oczywiście zostałem bez odpowiedzi), zmienili jej kod na tyle, że trzeba podać wynik prostego rachunku :D

Poczytałem o GD, o captcha i napisałem własny kodzik. Skrypt fajnie działa, możemy go rozszerzyć o tła czy nowe czcionki.
Zamieszczę kilka przykładowych obrazków, które generuje skrypt:

captcha
 captcha
 captcha
 captcha
captcha

Jak widzicie token jest czytelny. Zastosowanie losowej czcionki w każdym znaku sprawia, że litera powtórzona w tokenie może wyglądać inaczej, wtedy a != a. Specjalnie dobrałem tak czcionki, żeby litery nie wyglądały na proste i równe. Znaki w niektórych miejscach nachodzą na siebie, co zdecydowanie utrudni robote dla bota, podobnie jak losowe ułożenie (odstępy między znakami i pozycja z nachyleniem) znaków. Każdy znak jest innego, zbliżonego do siebie koloru (tak, tak, wiem, że to nie utrudnia roboty dla bota, ale newbie spamers się na tym złapią).
Dodatkowym plusem kodu jest nałożenie na obrazek z tokenem kreski czarnej, która też jest nakładana w losowym położeniu i z losowym naciskiem tyle razy, ile jest znaków w tokenie.

Jeśli chcesz rozszerzyć ten kod o swoje tła czy czcionki to musisz pamiętać by je dobrze dobrać. Czcionki nie powinny być równe, bardziej pokręcone, skrzywione (tylko nie przesadź!). Nowe czcionki umieść w katalogu captcha_fonts, a nowe tła w captcha_bg.

Jak używać captcha?
Obrazek generowany ze skryptu, umieszczamy na stronie w ten sposób:

<img src="captcha.php" />

Nie można zapomnieć, o wystartowaniu sesji, w pliku gdzie jest obrazek. Jeśli chcemy sprawdzić czy token jest dobrze wpisany, należy go porównać z zawartością sesji – $_SESSION['captcha'].

Kod captcha:

<?php
session_start(); #otwieramy sesje
$pool = "abcdefghijklmnouprstuwyz"; #deklaracja znakow
$kreska = imagecreatefromjpeg('kreska.jpg'); #tworzymy kreske z jpg
$background_array = glob('captcha_bg/*.jpg'); #wczytujemy tla
$font_array = glob('captcha_fonts/*.TTF'); #wczytujemy czcionki
$count_pool = rand(4,5); #losujemy liczbe znakow
$background = $background_array[array_rand($background_array)]; #losujemy tlo
$captcha = imagecreatefromjpeg($background); #tworzymy tlo z obrazka
for($x=1; $x<=$count_pool; $x++){
	$font = $font_array[array_rand($font_array)]; #losujemy czcionke
	$znak     = $pool[rand(0, strlen($pool)-1)]; #losujemy znaki
	$color = imagecolorallocate($captcha, rand(0,50), rand(0,70), rand(0,85)); #ustalamy kolor znakow
	$space = (round(imagesx($captcha) / $count_pool+1)-10)*($x-1)+30; #obliczamy odstepy miedzy znakami
	imagettftext($captcha,rand(30, 40),rand(-15, 35),$space,rand(40, 60),$color,$font,$znak); #nanosimy znaki
	imagecopymerge($captcha, $kreska, rand(1,10),rand(1,10),rand(1,10),rand(1,10), imagesx($captcha), imagesy($captcha), rand(10,30)); #nanosimy kreske
	$token .= $znak; #przypisujemy znaki
}
header('Content-Type: image/jpeg'); #odpowiedni naglowek
imagejpeg($captcha); #obrazek
$_SESSION['captcha'] = $token; #sesja z tokenem
?>
Kategorie:Archiwum, PHP Tagi:, ,
  1. Brak komentarzy
  1. Brak jeszcze trackbacków