PHP ile Güvenlik Kodu Oluşturmak

Yazan: türker | Tarih 30 Eylül 2007 | Yorum  8 Yorum
BerbatKötüOrtaGüzelHarika 10 kez puan verildi, Ortalama: 5 (5 üzerinden)
Loading ... Loading ...

Neredeyse irili ufaklı tüm web sitelerinde güvenlik kodlarını görmeniz mümkün. Kullanıcı kaydı yaparken, anket oylarken, bir foruma mesaj yazarken yada bir ziyaretçi defterini doldururken bu uygulama karşınıza çıkabiliyor. Peki bize eziyet etmekten başka ne işe yarıyor?

Aslında bu eziyetin tüm sebebi kendini bilmez internet kullanıcıları. Bu arkadaşlar çeşitli programlar kullanarak, siteniz için özene bezene hazırladığınız ziyaretçi defterine, foruma vs. birkaç dakika içinde binlerce kayıt girebiliyorlar. Her seferinde bu kayıtları tek tek silmeyi göze alsak bile sitenin asıl kullanıcılarına verdiği rahatsızlığı gidermek mümkün olmuyor.

Diğer yandan, web sitenizin bir yönetim sayfası olduğunu düşünelim. Bir kullanıcı adı ve şifreyle yönetim bölümüne giriş yapılıyor. Bahsi geçen kötü kullanıcılar şifrenizi ele geçirebilmek için farklı saldırılar kullanabilirler. Fakat basit bir güvenlik koduyla bu saldırılardan korunmak mümkün olabilir. Bu tür sorunlardan kurtulmak için site yöneticileri güvenlik kodu uygulamasını kullanmak zorunda kalıyor.

Bu kadar lafın ardından sistemin nasıl çalıştığını anlatmaya başlasam iyi olacak. Mantığı gayet basit. Bu uygulama index., resim., ve kontrol. olmak üzere üç dosyadan oluşacak. Adında anlaşılacağı üzere index. dosyasında kullanıcıya güvenlik kodu gösterilecek ve bu kodun girilmesi istenecek, resim. dosyasında kullanıcıya gösterilecek güvenlik kodunu resme dönüştüreceğiz, kontrol. dosyasında ise kullanıcının girdiği kodu kontrol edeceğiz.

Devam etmeden önce hemen belirteyim, bu uygulamayı denemek için sistemde GD kütüphanesi yüklü olmak zorunda, ayrıca SESSION(oturum) komutlarından da faydalanacağız. En azından session hakkında bilgiye sahip olmanız bu makaleyi anlamanız açısından gerekli.

Konumuza dönecek olursak, sistemin ilk aşaması şu şekilde işleyecek; index. dosyasında bir session başlatıp rasgele üretilmiş harfler ve rakamlardan oluşan bir değer oluşturacağız. Bu değeri sessiona kaydetikten sonra sonra index. dosyasından resim. dosyasında bu sessiona ait id’ yi göndereceğiz. Böylece index. içinde oluşturduğumuz ve sessiona kaydettiğimiz güvenlik koduna resim. dosyasından erişebileceğiz.

:
  1. session_start();  // session başlatıyoruz.
  2. $resim_kodu=""; // güvenlik kodumuzu tutacak değişkenfunction rasgele() { // rasgele sayı ve rakam üretmek için bir fonksiyon yazalım.
  3. $gecici_deger = mt_rand(1,3); // 1 ile 3 arasında rasgele bir sayı alalım.
  4. // Eğer sayı 1 ise, küçük harf, eğer sayı 2 ise rakam
  5. // eğer sayı 3 ise büyük harf üreteceğiz
  6. switch ($gecici_deger) {
  7. case 1:
  8. // 97 den 122 ye kadar olan ASCII kodları küçük harflerden oluşur.
  9. $gecici_deger = mt_rand(97, 122); // 97 ile 122 arasından rasgele bir değer alıyoruz.
  10. break;
  11. case 2:
  12. // 48 den 57 ye kadar olan ASCII kodları rakamlardan oluşur.
  13. $gecici_deger = mt_rand(48, 57); // 48 ile 57 arasından rasgele bir değer alıyoruz.
  14. break;
  15. case 3:
  16. // 65 den 90 e kadar olan ASCII kodları büyük harflerden oluşur.
  17. $gecici_deger = mt_rand(65, 90); // 65 ile 90 arasından rasgele bir değer alıyoruz.
  18. break;
  19. }return chr($gecici_deger); // $gecici_deger değişkeninde bulunan değeri geri döndürüyoruz.
  20. }
  21.  
  22. // Elimizde rasgele rakamlar ve harfler üreten bir fonksiyonumuz ve bir session var.
  23. // Geriye güvenlik kodunu oluşturup onu grafik olarak göstermek kalıyor.
  24.  
  25. // Şimdi 4 karakterden oluşan bir güvenlik kodu oluşturalım.
  26. for ($i = 1; $i <= 4; $i++) $resim_kodu.= rasgele();
  27.  
  28. // güvenlik kodumuzu elde ettiğimize göre bunu sessiona kaydedelim.
  29. $_SESSION['guvenlik_kodu'] = $resim_kodu;
  30.  
  31. // kullanıcının göreceği html kısmını gösterelim.
  32. echo '<html><head><title>Güvenlik kodu uygulaması</title></head><body><br>
  33. <form action="kontrol." method="POST" name="guvenlik" target="_self">
  34. <table width="500" border="0" cellspacing="0" cellpadding="0" align="center">
  35. <tr><td>
  36.    <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lütfen resimde
  37. gördüğünüz kodu, resmin yanındaki kutucuğa giriniz. Eğer kodu tam okuyamıyorsanız F5
  38. tuşuna basarak yeni kodu görebilirsiniz.</font></p>
  39.     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><img src="resim.?';
  40.  
  41. // resim. dosyasının resim oluşturacağını söylemiştim. Daha önceden güvelik kodumuzu
  42. // session içine kaydettirmiştik. Bu güvenlik kodunu resme dönüştürmek için resim.
  43. // dosyasına hangi session dosyasını kullanması gerektiğini söylüyoruz.
  44. echo session_id();  // bu satır ile session dosyasının idsini resim. dosyasına iletmiş oluyoruz.
  45.  
  46. echo '"></font></p>    
  47.       <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Kodu girin: </font>
  48.         <input name="kod" type="text" id="kod" size="30">
  49.             <input type="submit" name="Submit" value="OK">
  50.       </p>
  51.     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
  52.           <b>Not:</b>Güvenlik kodu büyük küçük harf duyarlıdır!
  53.     </p>
  54.   </td></tr>
  55. </table><div><input type="hidden" id="x" name="x" value="F3CB2" /></div></form></body></html>';
  56. ?>

Bu dosya ile işimizi bitirdik. Güvenlik kodunu tutmak için neden session kullandık derseniz, hem güvenlik hem de fazladan hamallık yapmamak için. Güvenlik kodunu cookie kullanarak, dosya yada veri tabanı kullanarak da tutabilirsiniz ancak cookie kullanıcının bilgisayarında tutulduğu için istediğimiz güvenliği bize sağlayamaz. Dosya veya veri tabanında tutulan kodları ise belirli periyotlarda bizim silmemiz gerekir çünkü yer kaplarlar. Session dosyaları hem sunucuda tutuldukları hem de otomatik olarak silindikleri için ideal bir çözüm.Session içine kayıtlı olan güvenlik kodundan bir resim oluşturmamız gerekiyor. Bunun için kullanacağımız resim. dosyasında hangi session dosyasını kullanacağını bildirmiştik.

:
  1. // UYARI: Resim oluşturabilmek için sistemde GD kütüphanesinin kurulu olması gerekir.// daha önce index. dosyasında oluşturduğumuz sessiona erişmek için session başlatıyoruz.
  2. // sonra bu session içine kaydettiğimiz güvenlik kodunu alıyoruz.
  3. $guvenlik_kodu= $_SESSION['guvenlik_kodu'];
  4.  
  5. // eni 100, boyu 40 olan bir resim oluşturuyoruz.
  6. $resim=imagecreate(100,40);
  7.  
  8. // ben resim için siyah ve beyaz renklerini kullanacağım.
  9. // diğer renkleri de rgb kodlarını yazarak kullanabilirsiniz.
  10. $resim_siyah = imagecolorallocate($resim,0,0,0);
  11. $resim_beyaz = imagecolorallocate($resim,255,255,255);
  12.  
  13. // resmin arka planı siyah, yazılar ise beyaz olacak.
  14. // bu komutla resmi siyaha boyuyoruz.
  15. imagefill($resim,0,0,$resim_siyah);
  16.  
  17. // güvenlik kodu için 4 karakter kullanmıştık. bu karakterleri tek tek resme yazmaya
  18. // başlıyoruz. ayrıca kullanıcıyı deli etmek için karakterleri farklı büyüklükte yazıyoruz. :)
  19. // böylece tam bir güvenlik kodu olmuş oluyor.
  20. imagechar($resim,4,20,13,$guvenlik_kodu[0],$resim_beyaz);
  21. imagechar($resim,5,40,13,$guvenlik_kodu[1],$resim_beyaz);
  22. imagechar($resim,3,60,13,$guvenlik_kodu[2],$resim_beyaz);
  23. imagechar($resim,4,80,13,$guvenlik_kodu[3],$resim_beyaz);
  24.  
  25. // siyah arka planı olan ve beyaz olarak, bazı karakterlerin büyüklüğü değiştirilerek, güvenlik
  26. // kodu yazılmış resmimizi tarayıcıya gönderiyoruz.
  27. header('Content-type: image/png');
  28. imagepng($resim);

İşin çoğunu hallettik. Ben güvenlik kodu resmini tarayıcıya gönderirken PNG formatını seçtim. JPG, GIF veya WBMP formatlarını kullanabilirsiniz.Şimdiye kadar yaptığımız işlemleri kısaca özetlersek, bir güvenlik kodu oluşturduk, bu kodu resme dönüştürdük ve güvenlik kodunun olduğu resmi gösterdik. Şimdi sıra kullanıcının girdiği kodu kontrol etmeye geldi. Bunun için de son dosyamız olan kontrol. dosyasını kullanacağız.

:
  1. // tekrar session başlatıyoruz.
  2.  
  3. // kullanıcının girdiği kodu alıyoruz.
  4. $girilen_kod = $_POST['kod'];
  5.  
  6. // session içinde kayıtlı olan kodu alıyoruz.
  7. $guvenlik_kodu=$_SESSION['guvenlik_kodu'];
  8.  
  9. // bu iki değeri bir biriyle karşılaştırıyoruz.
  10. if ($girilen_kod == $guvenlik_kodu) {
  11. echo 'çok beceriklisiniz. doğru kodu girdiniz.';
  12. }
  13. else {
  14. echo 'güvenlik kodu hatalı';
  15. }
  16. // artık session dosyasına gerek kalmadı. Dolayısıyla bu dosyayı kaldırabiliriz.

Güvenlik kodundaki karakter sayısını isteğinize göre arttırabilir yada azaltabilirsiniz. Bunu yaptığınızda gerekli yerleri düzenlemeniz gerekecektir. İşi iyice abartıp karakterleri deforme edebilir, resmin arka planını karmaşık şekillerden veya renklerden oluşturabilirsiniz. Her karakteri farklı farklı renklerden oluşturabilirsiniz. Bu tamamen sizin gereksinimlerinizle alakalı. Makalenin en başında bahsettiğim saldırılara maruz kalıyorsanız bu uygulamayı en basitten en zora doğru uygulamak bence en mantıklı olanı. Hem gereksiz yere uğraşmamış olursunuz hem de kullanıcılar güvenlik kodunu okurken zorlanmazlar.

Ayrıca kontrol. dosyası şu haliyle güvenlik zaafı barındırıyor. Bunu gidermek de sizin işiniz. Ben sadece ufak bir ipucu vereceğim. Eğer birisi index. dosyasına uğramadan kontol. dosyasına gelirse(mesela kendi sunucusunda bir index. oluşturup sizin kontrol. sayfasınıza POST ile veri gönderirse) "if ($girilen_kod == $guvenlik_kodu)" sorgulaması nasıl çalışır biraz düşünün. Cevabı bulduğunuzda eksikliğide çok basit bir şekilde girebileceksiniz.

Kolay gelsin.

Yazdır Yazdır | 2,597 Görüntülenme | Kategori: PHP | Trackback  Geri İzleme
Etiketler  Etiketler: , , ,

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>