Günümüzde maalesef hacker dediğimiz lamerler hiçbir şeyi affetmiyor.Eskiden bir formdan veri göndermek problem olmuyorken şimdi ise robotlarla o formdan dakikada 100 binlerce sorgu gönderilip veritabanı şişirilebiliyor.Bunun çözümü ise sadece insanların cevaplayacağı şeyler kullanmak olabilir.Bunların başında ise güvenlik kodu geliyor.Güvenlik kodunun yanı sıra iller,ilçeler basit toplama çıkarma işlemleri de yapılabiliyor.Böylece robotlara karşı daha korunaklı oluyoruz.Bu yazımda ise sizlerle bir PHP Captcha yani Güvenlik Kodu uygulaması yapmak istiyorum.

Güvenlik Kodu Nedir?
Güvenlik kodu sürekli olarak değişen rastgele harfler ve rakamlardan oluşan bir resimdir.Bu resim çeşitli dillerle dinamik şekilde oluşturulur ve sabit kalmaz.Yani biz her sayfayı yenilediğimizde değişir.Mesela örnek olarak yukarıdaki resimi verebiliriz.Sayfa yenilendiğinde sürekli değişir.

Mantığı Nedir?
Güvenlik kodu uygulamasının mantığı PHP’de rastgele harfler ve rakamlar oluşturarak onlardan belirtilen sayıdakini resime yazdırmaktır.Bu olay PHP’nin GD kütüphanesi ile olur.Localhost denemelerinde kütüphaneyi etkinleştirmek zorundasınız.

Kontrol kısmı ise 2 yönlü olur.İlk önce resim ve oturum değeri oluşturulur (Session) . Ardından PHP formdan gelen bilginin o oturum değeriyle aynı olup olmadığını kontrol eder ve eğer yanlışsa ekrana yanlış yazdırır veya veritabanına kaydeder.

PHP- Kodu:
session_start();
error_reporting(0);
header('Content-type:text/html;charset=utf-8');
switch(
$_GET['resim']){
    case 
'evet':
 
                
$sifre=substr(md5(rand(0,99999999999999)),-6);
                if(
$sifre){
                
$_SESSION['captcha']=$sifre;
                
$resimyarat=ImageCreate(180,40);
                
$beyazlik=ImageColorAllocate($resimyarat,255,255,255);
                
$rastgele=ImageColorAllocate($resimyarat,rand(0,255),rand(0,255),rand(0,255));
                
ImageFill($resimyarat,20,20,$rastgele);
                
ImageString($resimyarat,5,58,14,$_SESSION['captcha'],$beyazlik);
                
ImageLine($resimyarat,200,25,0,1,$beyazlik);
                
header('Content-type:image/png');
                
ImagePng($resimyarat);
                
ImageDestroy($resimyarat);
                }
break;
 
default:
$guvenlik=$_POST['guvenlik-kodu'];
 
if(!
$guvenlik){
    die(
'<img src="guvenlik-kodu.php?resim=evet" style="border-radius:5px;width:180px;height:40px;" /><br/><br/><form method="post">Kodu gir:<input type="text" name="guvenlik-kodu" /><input type="submit" /></form>');
    }
 
if(
$guvenlik == $_SESSION['captcha']){
    print(
'<img src="guvenlik-kodu.php?resim=evet" style="border-radius:5px;width:180px;height:40px;" /><br /><br/><form method="post">Kodu gir:<input type="text" name="guvenlik-kodu" /><input type="submit" /></form><script>window.alert("Kod Doğru!");</script>');
 
}else{
 
print(
'<img src="guvenlik-kodu.php?resim=evet" style="border-radius:5px;width:180px;height:40px;" /><br/><br/><form method="post">Kodu gir:<input type="text" name="guvenlik-kodu" /><input type="submit" /></form><script>window.alert("Kod yanlış!");</script>');
    }

guvenlik-kodu.php adında bir dosyaya kaydediniz.

Ne Yaptık?
İlk önce oturumu session_start() ile başlattık.Ardından switch-case mantığı ile resmin oluşacağı başka bir dosya belirlemektense “GET” komutuyla onu guvenlik-kodu.php?resim=evet olarak yaptık ve burada gözükmesini sağladık.

Resimi oluşturduk fonksiyonumuzda ve -6 ile 6 adet harf ve rakam seçtik.Ardından bu olay başarılıysa oturum değeri oluşturduk.
$guvenlik değişkeni ile formdan gelen bilgiyi değişkene geçirdik.Bu değişkende değer yoksa form ve resmin gözükmesini print() fonksiyonu ile sağladık.Ardından form gönderildiğinde oturum değeriyle formdaki değer örtüşüyor mu diye baktık.Eğer örtüşmüyorsa pencerde “Kod yanlış!” örtüşüyorsa da “Kod doğru!” yazdırdık.