PHP İle Resim Doğrulaması-Güvenlik Kodu Oluşturma

resim dogrulaması captchaDüşündüm de ne zamandır eğitim amaçlı birşeyler yazmıyorum. Bi baktım 2 gündür de yazı yazmıyormuşum, dedim bugun birşyler paylaşıyım ziyaretçilerimle. İlk php ye başladığım zamanlar mantığını bir türlü oturtamadığım Türkçemize Resim Doğrulama olarak da çevirebileceğimiz Captcha dan bahsediyorum bugün biraz.Captcha ise aslında bir cümledeki kelimelerin baş harflerinin alınması ile elde edilmiş bir kelime:"completely automated public Turing test to tell computers and humans apart" Böyle soru-cevaplı olarak gitmeyi düşündüm bu anlatımımda.

  • Resim Doğrulaması Nerelerde Kullanılır?

Genel olarak web sayfalarının POST gönderilme yerlerinde kullanılır. Mesela yazı gönderme, yorum gönderme, iletişim kurma, mail gönderme vs gibi yerlerde.

  • Resim Doğrulaması Kullanmanın Avantajları Nelerdir?

Resim doğrulamasının kullanılmasındaki amaç Flood yapan yani arka arkaya post ederken sunucunun bir zaman sonra bu isteklere cevap veremeyerek kapanması( down olması)nı sağlayan programların kullanılarak sistemimizin zarar görmesini engellemek. Web sitenize giren kötü amaçlı şahıslar sitenizdeki bir iletişim formunu kullanarak veritabanınıza anında yüzlerde kayıt ekleyebilirler.

  • Bu Sistem Ne Kadar Güvenli?

Şöyle söyleyebilirim ki kendi fikrimce iyi hazırlanmış bir resim doğrulaması günümüzde Flood için en iyi önlem diyebilirim. Bundan farklı uygulamalar da var. Örneğin; sesli doğrulama, işte matematiksel işlem yaptırma gibi...

Şimdi ise nasıl kullanıyoruz ve çalışma mekanizması nasıl buna gelelim biraz da,

Duruma birazcık basit yaklaşırsak, elimizde bir formumuz var ve bu formun bir insan tarafından doldurulduğunu anlamak istiyoruz. Hemen bu iş için biçilmiş kaftan Captcha yı kullanıyoruz. Yani kullanıcıya bir takım kodlar üreteceğim mesela HF93HD93 gibi ve bu kodları aynı gönderdiği formda birlikte postalamasını isteyeceğim.

Şimdi duruma şu tarafından bakarsak eğer Form gönderilirken "yan taraftaki kod buraya yazın" gibi bir ibare kullanılıp kod da  text olarak sunulsaydı bir program yardımızla rahatça parse edilip o kodu aynı flood programına yazdırabilirdiniz.

Peki o zaman bizim için gerekli olan şey kodu bir Resmin üzerine yazmak ve Parse edilmeyi oldukça zorlaştırmak.Yani resim işlenilip yine o kod bulunabilir ama en azından saldırganın işi uzar.

Peki esas mantığımızı anladık bir kod oluşturcaz ve o kodu SESSION olarak atayacağız. Hani aklımızda tuttalım da adam kodu yazdığında gerçekmi diye kotrol edeceğiz. Şimdi gelelim Resim.php yani işte FDS7F7SD gibi abuk subuk harf-rakam(alfanümerik) kümesinin nasıl oluşturulduğuna.

Kısaca kodu vereyim

*********************************************************************

///resim.php olarak kaydet///////

///Resim.php her çalıştırıldığında farklı şifre türetecek bir fonksiyon oluşturuyoruz. 

function olustur () {
 $sifre = substr(md5(rand(0,999999999999)),-6);
 if ($sifre) {
  session_start();
  $_SESSION["koruma"] = $sifre; //oluşturulan şifre session'a aktarılıyor
  $yaz=$_SESSION[koruma];
  $say=strlen($yaz);
  for ($i=0; $i<=$say; $i++) {
    $a .= $yaz[$i]." ";
  }
  //Fontlarin Oldugu Klasörü Tanitiyoruz
putenv('GDFONTPATH=C:\WINDOWS\Fonts');
 
//Kullanmak Istedigimiz Yazi Tipinin Adi
  $yazitipi = 'verdana.ttf';
  $width  = 120;
  $height =  25;
  $resim = @imagecreate ($width,$height);//resim dosyası oluşturuluyor
  $beyaz  = ImageColorAllocate($resim, 255, 255, 255);
  $rand   = ImageColorAllocate($resim, 141, 43, 250);
  ImageFill($resim, 0, 0, $rand);
 
  // farkli büyüklükte resim olusturuyoruz
 
  imagechar($resim,16,15,8,$sifre[0],$beyaz);//sifreyi nin 0. karakterini resmin farklı bölgesinde gösteriyorz. vs..

imagechar($resim,18,35,8,$sifre[1],$beyaz);

imagechar($resim,15,55,8,$sifre[2],$beyaz);

imagechar($resim,10,65,8,$sifre[3],$beyaz);
imagechar($resim,15,85,8,$sifre[4],$beyaz);
imagechar($resim,18,105,8,$sifre[5],$beyaz);
imagechar($resim,18,105,8,$sifre[6],$beyaz);

 


  header("Content,type: image/png");
  ImagePng($resim);
  ImageDestroy($resim);//oluşturulmuş resim geçiçi idi artık yer kaplamasın diye siliyoruz
 }
}
olustur();//farklı bir şifrenin oluşturulmasını sağlar

**************************************************************

Şimdi yukarıda örnekteki kodları php doyası olarak kaydettiğinizde artık resmi göstermeye 1 adım daha yaklaştınız demektir. Yapmanız gereken <img src="resim.php" .... şeklinde resmi göstermek. Unutmayın resmi her gösterdiğiniz resmin üzerindeki kod SESSION'a yazılıyor. TamamdırLaughing

Sıra geldi kontrolümüze. İşte en kolay kısımda burası:

if($_SESSION[koruma]!=$_POST[guvenlik])

{

echo "hatalı güvenlik kodu"; 

 

Umarım anlatabilmişimdir. Bu arada makeleyi anlayabilmek için azda olsa php bilginizin olması gerekiyor :)

Captcha ile ilgili yararlanabileceğiniz kaynaklar.

http://recaptcha.net/whyrecaptcha.html

http://tr.wikipedia.org/wiki/CAPTCHA


Twitter Digg Delicious Stumbleupon Technorati Facebook

Etiketler: ,

“PHP İle Resim Doğrulaması-Güvenlik Kodu Oluşturma” yazısına gelen cevaplar;

  1. Çok sağol nasıl yapılıyor diye merak etmişimdir hep

  2. Blogumda deneyeceğim.Umarım becerebilirim

  3. çok teşşekkür ederim. Bir sorum olcak ben bu kodları kullandığımda türkçe karakter sorunu ile karşılaşıyorum

  4. Merhaba, türkçe karakter sorunu nerede yaşıyorsunuz anlamıyorum ?. Yani çıkan karakterler zaten türkçe karakter içermiyor. Sadece şifre oluşturuluyor.



  5. Bu güvenlik kodu uygulamasını veri tabanıyla nasıl bağlantılayabiliriz.

    kodu yanlış giriyorsa veri tabanına veri eklenmesin gibi.

    uğraştım uğraştım yapamadım.

    kodu doğruda girsem yanlışta girsem veri tabanına kaydediyor.

  6. if($_SESSION[koruma]!=$_POST[guvenlik])



    {



    echo "hatalı güvenlik kodu";



    }





    buradaki echo "Hatalı güvenlik kodu ";



    kısmı güvenlik kodunun yanlış girilmesi durumundaki işlenecek bölümdür. Buraya

    veritabanına veri ekleyen kodu yapabilirsiniz.

  7. Çok teşekkür ederim, acil lazımdı ;)

  8. yahu çalıştıramadım kaydet.php'me postluyorum verileri oraya yolladıktan sonra kod hatalı kısmına bir de session'daki güvenlik kodunu ve formdan yolladığım kullanıcının yazdığı kodu değişkenlere atayıp echo ile yazdırıyorum, formdan gelen veride bir problem yok ekrana yazılıyor ancak session değerini atadığım değişken boş gözüküyor bir değer yok. Yani session'a kod atanmıyor. Resim falan gözüküyor bu durumda yazdığın kodlarda hata yok. Aklıma bir tek bunu localhostta çalıştırdığım için problem oluşturuyor olabileceği geliyor. Bir de hosta atıp deneyeyim diyorum ama yine de ümitli değilim..





    Şöyle bir kodum var

    ***********************

    $dene1=$_POST[guvenlik];

    $dene2=$_SESSION[koruma];

    if($_SESSION[koruma]!=$_POST['guvenlik'])



    {



    echo "hatalı güvenlik kodu<br>";

    echo "$dene1 dene1<br>";

    echo "$dene2 dene2";

    }



    ****************



    calistirdigimda ekrana;



    hatal&#253; güvenlik kodu

    123123 dene1

    dene2



    yazıyor yani sesion boş. Anlatabildim mi bilmiyorum ama cevabını bekleyeceğim..

  9. Değişen birşey olmadı hostta'da aynı sorunu verdi, incelemek istersen link; kabakca.com/kayit.php



    bu arada inceledikten sonra bu mesajı silersen sevinirim..

  10. birşey daha farkettim güvenlik kodunu boş bıraktığımda sorun çıkmıyor bu da sessiondaki değerin boş olduğunu kesinleştiriyor. Kodları aynen kopyaladım nerde hata yapıyorum aceba :S

  11. Hatamı buldum arkadaşlar, formdaki bilgileri gönderdiğim yani kayit.php sayfamın en üstüne



    session_start();



    yazmayı untmuşum, oturum açılmadan nasıl veri yazılsın ya da çekilsin ki =)

  12. Selamlar,

    Benim de benzer bir koda ihtiyacım oldu ancak img src=resim.php bana bir resim oluşturmuyor malesef

    nerede yanlış yapıyor olabilirim?



    şimdiden teşekkürler



    Fatih

  13. Sunucunuzda GD kütüphanesi yüklenmemiş olabilir

  14. Haklısınız ben gd kütüphanesinin gerekli olduğunu bile bilmiyormuşum, biraz araştırıp kendi makinemde sorunu hallettim ancak sunucuya yüklediğimde çalışmıyor kod, linux bir sağlayıcıdan hosting hizmeti alıyorum, sanırım onların yüklemesi lazım gd kütüphanesini?

  15. Evet GD kütüphanesi olmadığı durumda hata alırsınız da anlaabilmemiz açısında ekran çıktısını yazarsanız sanırım daha fazla yardımcı olurum :)

  16. Test edenler için ayrı bir alan yapmam lazım sanırım (:

  17. test dedik yaaa

  18. Bilgiler gerçekten işime yaradı, Teşekkürler.

  19. sürekli hatalı kod girdiniz hatası veriyor bu, bi türlü düzeltemedim.

Yorum Gönder

İsim

E-mail Adresi

Web Sayfanız (Spamı sevmiyoruz)

Güvenlik Kodu

güvenlik kodu

Mesajınız

Yeni yorumlardan beni haberdar et.

working..