Signup, login vs. gibi kullanıcıdan form aracılığıyla bilgi girmesini beklediğimiz uygulamalarda,
post (veya get) edilen datayı, gerçekten kullanıcınınmı(insan) yoksa iyi niyetli olmayan bir
programınmı gönderdiğini anlamamız gerekebilir. Bu noktada insanın algı mekanizmasını kullanıp,
kötü niyetli programın resim olarak algıladığı, ama insanın resimdeki şekilleri harf ve rakam
olarak algıladığı bir atlatmaca kullanırız. İçinde harfler ve rakamlardan oluşan text bulunan bir
resim bu atlatmacayı kolayca yapacaktır. Ancak bazı OCR uygulamaları image dosyası içindeki
şekilleri ascii karakterlere çevirebilmektedir. OCR programları kitap harfleri ve bilinen
fontlardaki düzgün şekilleri ascii ye çevirebilmektedirler. Bunun için resmimizdeki texti biraz
okunması zor hale getirmek yeterli olacaktır. Hele yazı için yamuk bir font kullanırsak ocr nin işi
çok zorlaşacaktır.
Kod:
< form name=formlogin method=post action="dologin.php">
Kullanıcı Adı :
< input name=user_title>< br>
Kullanıcı Şifre:
< input type=password name=user_pass>< br>
Güvenlik Kodu:
< input name=security_code>< br>
< img src="s_code.php" width="144" height="32" border="0">
< /form>
Yukarıdaki basit giriş formuna s_code.php ile resim dosyası oluşturalım;
Kod:
< ? php
// s_code.php dosyamızın .png olarak algılanabilmesi için header
header("content-type: image/png");
session_start();
// hafızada boş bir image oluşturalım
$im = imagecreate(144, 32);
// resmimizin arka plan rengi için beyaz, yazı rengi için siyah renklerini oluşturalım;
$byz = imagecolorallocate($im, 255, 255, 255);
$syh = imagecolorallocate($im, 0, 0, 0);
// resmimizi beyaza boyayalım. (default siyah oluşur)
imagefill($im, 0, 0, $byz);
// resmimizin arkasına desen yapıyoruz
// bunun için 20 adet boyutları ve rengi rastele elips ekleyelim
for($i=0;$i<20;$i++) {
$e_x = rand(0,144);
$e_y = rand(0,32);
$e_genislik = rand(3, 100);
$e_yukseklik = rand(3, 100);
$e_renk = imagecolorallocate($im, rand(200,255), rand(200,255), rand(200,255));
imagefilledellipse($im, $e_x, $e_y, $e_genislik, $e_yukseklik, $e_renk);
}
// güvenlik için session_id yi hash edip ilk 5 karekterini alalım
$kod = substr(md5(sha1(session_id())), 0, 5);
// bu beş karekteri resmin içine yazalım.
// yazarken bu dosyanın yanına koyacağımız
// True Type bir fontu kullanabiliriz.
// Burdaki 16 = font boyutu, 10 = açısı, 30 = x ve 22 = y
imagettftext($im, 16, 10, 30 , 32, $syh, 'ace.ttf', $kod);
// oluşan image i gösterelim
imagepng($im);
//hafızadaki resmi silebiliriz
imagedestroy($im);
? >
Düzenleme: Gurur Polat
Alıntı:turk-php.com