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

ARA 01 007-

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.

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ı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.

Şö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



© HRMNKY (http://www.harmankaya.org)