• 12-07-2007, 14:12:53
    #1
    - CAPTCHA -
    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
  • 12-07-2007, 17:32:09
    #2
    Üyeliği durduruldu
    Güzel çalışma eline sağlık.
    Yanlız $_GET['text']; yerine $_GET['hash']; olmayacakmı
  • 12-07-2007, 17:37:44
    #3
    Olacak bak oldu bile
  • 12-07-2007, 20:22:12
    #4
    session a kaydedilecek verinin random olması daha sağlıklıdır. zira basit bi botla formdaki "b.php?hash=" has değeri alınıp çeşitli işlemlerden geçirilip güvenlik kodu olayı etkisiz hale getirelebilir. belki substr, md5 in birkaç kez kullanımı güvenli gibi gelsede php den anlamayan birinin bu kodu kullanıp mağdur olması söz konusu.
  • 12-07-2007, 21:33:08
    #5
    Elbette random almak daha sağlıklı, ben ek olarak başka bir string ekleyerek botları engelleyebileceğimi düşündüm. Çözerlerse öyle de yaparız
  • 14-07-2007, 13:26:51
    #6
    swf yada 3d captcha da güzel olurdu

    swf ne kadar güvenli olurdu bilmem ama 3d daha iyi olurdu

    rotate i yazı fontu ,font boyutu , arkaplan resmi,font rengi,font bulanıklığı ,üstüne gelen ekstradan çigziler vs. captcha nın kırılma olasılığındaki oranı düşürüp artirior

    PWNtcha - captcha decoder
  • 14-07-2007, 15:14:34
    #7
    Seni ilgilendirmez nasıl olduğu sen git bot yaz
    Şaka 1 yana swf veya gif ile yapmak çok daha güzel olur. Onları da denemek lazım.
  • 14-07-2007, 16:38:09
    #8
    Üyeliği durduruldu
    bir makalede okumuştum artık captcalarda yazı yerine insanlara has bir özellik olan duygular kullanılacakmış yani şöyle aşağıdaki kedilerden hangisi sevimlidir? gibi
  • 14-07-2007, 16:48:51
    #9
    UndeRTakeR adlı üyeden alıntı: mesajı görüntüle
    Seni ilgilendirmez nasıl olduğu sen git bot yaz
    Şaka 1 yana swf veya gif ile yapmak çok daha güzel olur. Onları da denemek lazım.
    en popüler forum & blogların captcha larını kıran botlarım war zaten
    @tyranid
    dediğin yöntem zaten kullanılmakta
    php.net e not ekleyenlere two minus one? gibi sorular soruluyor
    bir de şey war mp3 captcha
    Captcha Talk A captcha with speech
    mp3 + swf captcha
    <?php
    // swfmovie.php - swf output and config
    session_start();
    /********************************************************************************
    * Note: sample includes depending on the PHP version
    * Use formprotect.php on PHP 5 
    * Use swfcaptcha4.php on lower PHP versions
    ********************************************************************************/
    if (version_compare(phpversion(), "5.0.0", ">=")) { 
    	include_once('classfile/swfcaptcha.php');
    } else { 
    	include_once('classfile/swfcaptcha4.php');
    } 
    $swfc = new swfcaptcha();
    // SWF OPTIONAL USER OPTIONS - SEE CLASS ALSO
    /*
    		// Default colors for characters
    	$swfc->colors = array('EE0000','00EE00','0000EE','00EEEE','EEEE00','EE00EE');
    		// Default background color
    	$swfc->bgcolors = array('000000');
    		// Swf movie width and height
    	$swfc->swf_width = 210;
    	$swfc->swf_height = 75;
    		// Offset for char movie in main swf movie
    	$swfc->swf_x = 10;
    	$swfc->swf_y = 50;
    		// Scale char movie in main movie
    	$swfc->x_scale = 5;
    	$swfc->y_scale = 5;
    		// Space between chars in char movie
    	$swfc->font_width = 30;
    		// Thickness of font lines in char movie
    	$swfc->font_line = 65;
    		// Captcha char lenght
    	$swfc->captcha_length = 6;
    		// Time settings for animation: draw - still display and rotate
    	$swfc->drawtime = 70;
    	$swfc->stilltime = 3000;
    	$swfc->rotatetime = 150;
    		// different animation type = 0, 1, 2, 3
    	$swfc->animation = 3;
    		// animation scale to ( from zero to scale )
    	$swfc->animateoffset = 0;
    		// y float, 0 = off ( value is random y axis movement )
    	$swfc->animatefloat = 5;
    		// Default fonts to use - empty is read all .fdb fonts from font dir
    		// Note: only .fdb fonts
    	$swfc->font = array('Arial.fdb','EtcEtc.fdb');
    	$swfc->fontdir = "font";
    		// Free bitstream vera fdb fonts - http://ming.sourceforge.net/
    		// Default background image ( optional )
    		// jpg - png or gif ( NB this Ming function is buggy with jpg's )
    		// $bgimages empty and $bgimgauto true is autoscan dir for images
    	$swfc->bgimages = array();
    	$swfc->bgimgauto = false;
    		// Default dir to background images
    	$swfc->imagesdir = "images";
    		// Default dir to sounds 
    	$swfc->sounddir = "sounds";
    		// Language folder user defined (  country code lowercase )
    		// All sound files have a prefix: msc_ - except the starting sound codestart.mp3
    	$swfc->soundlang = "";
    		// Movie frame rate
    	$swfc->framerate = 12;
    		// Frames for dound duration - depends on framerate
    		// Experiment with values for correct sound duration
    	$swfc->soundframes = 25;
    		// Sample sounds 22kc 1.5 sec mono mp3
    		// use DNSBL check if dnsblist is not empty and usednsbl = true
    		// set in class file
    	$swfc->forbidden_img = "forbidden.gif";
    		// On DNSBL listed - generate an error sound ( from sound dir )
    	$swfc->forbidden_sound = "forbidden.mp3";
    */
    $swfc->swfmovie();
    ?>
    $swfc nin alt değerlerini rand vererek kırılma olasılığını azaltabilirsiniz