Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) sisteminin amacı bilgisayarlar (web'de kullanılan botlar) ile insanların ayırt etmektir.
Genelde web sitelerinin üyelik sayfalarında kullanılır ve botların siteye üye olup spam yapmasını engeller. (şu anda forumumuzda böyle bir eklenti var ancak botlar OCR ile geçiyor, neredeyse hergün 1 bot siliyorum
) Bu durum ne kadar güzel bir çözüm gibi görünüp botları istenilen sayfalardan uzak tutsada biz insanlara eziyet etmektedir. Çünkü CAPTCHA ile üretilen resimler botların OCR (optical character recognation - optik karakter tanıma) kullanılarak tanımlanmasın diye allak bullak edilerek gösterilmektedir. Aksi halde OCR ile botlar bu resimleri tanımlayıp gerekli karakterleri bulabilmektedir. Bu önlemden dolayı bazen biz insanlar bile bu resimleri okumakta zorluk çekiyoruz, bundan dolayı bazı siteler resmi yenilememize olanak sağlıyorlar. Bu teknik her ne kadar insanlara zorluk çıkarsada botları uzak tuttuğu için yaygın bir şekilde kullanılmaktadır.Aslında capthca alternatifi olmayan bir sistem değildir. Bir yıla yakın süredir güzel bir alternatifi var: KittenAuth. KittenAuth insanların duygularını kullanarak gerçekten insan olduğunu doğruluyor diyebiliriz. KittenAuth sisteminin ilk kullanım örneğinde 9 resmin arasından 3 kedi resminin seçilmesi istenmekteydi, zaten ismini bu şekilde almıştır. Sayfaya gelen 9 farklı resimden 3 kedinin mouse ile seçilmesi gerçekten biz insanlara çok büyük kolaylık sağlamaktadır. Bir kere captcha sisteminde olduğu gibi resimde bulunan yazıyı çözmeye gerek kalmayacak ayrıca klavye ile uğraşmadan 3 'tık' ile işi bitireceğiz. KittenAuth umarım önümüzdeki günlerde daha sık kullanılır

KittenAuth sistemi yayılana kadar biz CAPTCHA'ya bir göz atalım ve nasıl yapabileceğimizi görelim.
Bu yöntemde kullanıcı kayıt olacağı (herhangi başka bir işlemde olabilir) sayfaya geldiği zaman rasgele bir karakter (sayılarda kullanılabilir) dizisi oluşturulur ve bu karakter dizisi GD kütüphanesi yardımıyla resim olarak sayfaya bastırılır. Kullanıcı bu sayfayı açtığı zaman üretilen karakter dizisi kullanıcının bilgisayarına bir cookie olarak kaydedilir. Aslında burada direk karakter dizisi değil onun hash'lenmiş hali atılmaktadır. Direkt olarak karakter dizisini atsak botların bu bilgiyi kullanmasına engel olmayacktır. Cookie yerine session kullanılarakta bu bilgi kayıt edilebilir. Asıl amaç sadece formun işleneceği sayfaya bu bilginin taşınmasıdır. Formun işleneceği sayfa açıldığı zaman kullanıcının (veya botun) forma girdiği yazı tekrar hashlenir ve kullanılan yönteme göre gerek cookie gerekse session'da tutulan değer ile karşılaştırılır ve insan-bot ayrımı yapılır.
Olayın mantığı bundan ibaret şimdi gelelim resmi oluşturma işlemine, PHP zamanı

Alttaki sayfayı b.php olarak kaydedin.
<?php
header("Content-type: image/png");
$yazi = $_GET['hash'];
$hash = substr (md5 ($yazi),5,6);
$en = strlen($hash)*15;
$boy = 50;
$resim = ImageCreate($en, $boy);
$siyah = ImageColorAllocate($resim, 0, 0, 0);
$beyaz = imageColorAllocate($resim, 255, 255, 255);
imagefilledrectangle($resim, 0, 0, $en, $boy, $siyah);
ImageString($resim, 5, 15 , 15 , $hash , $beyaz);
ImagePNG($resim);
?>Bu bizim resmi ürettiğimiz sayfa, birde form sayfası gerekli...Bu sayfayıda b.php ile aynı klasöre istediğiniz isimle kaydedin ve açın
<?php
session_start();
if(isset ($_POST['capText']) ){ //Form işleme mi yapılacak ?
if($_SESSION['hash'] == substr (md5 ($_POST['capText']),5,6)) //Session'dan gelen hash ile kullanıcının girdiği text aynı mı ?
echo "Doğru";
else
echo "Yanlış";
}
else{ //Form gösterimi yapılacak
$text = "Ahmet";
$_SESSION['hash'] = substr (md5 ($text),5,6); // üstte yazdığımız texti hashledik sonra 5. karakterden başlayıp 6 karakteri aldık
// aldığımız karakterlei session'a kaydediyoruz
$html = "
<form name='captcha' method='POST' >
<input type='text' name='capText'>
<input type='submit' value='Gönder'>
</form>
<img src='b.php?hash=".$text."'>
";
echo $html;
}
?>İkinci dosyamızda:<img src='b.php?hash=".$text."'>Satırı bize sayfaya bir resim eklememizi söylüyor ancak kaynağı bir resim dosyası değil b.php diyor. Aslında b.php dosyasına gerek kalmadan tek dosyada resmi üretip kaydedip resim kaynağına da kaydettiğimiz dosyayı verebilirdik. Eğer öyle bir yol izlersek resmi "ahmet.png" olarak kaydedersek form sayfası yenilendiğinde resim önbellekten okunarak eski resmin gösterilmesi olasılığı var. Ondan dolayı resmi kaydetmeden ekrana çıktı olarak vermek daha kullanışlıdır.
Benim diyeceğim bu kadar

// Yazan: undertaker
// Msn : under_taker_m@hotmail.com
// Tarih 06.07.07
// Kaynak göstermeden (Ç)alıntı yapanın vay haline

