Wednesday 13 August 2014

PHP DE RESİM DOĞRULAMA

    İnternette gezinirken birçok login sitelerinde güvenlik amaçlı olarak resim doğrulama kullanılmaktadır.Temel amaç kullanıcının bir spam botu gibi veya sanal kişilikler gibi olmadığını sağlamaktadır.


Öncelikle index.php sayfamızı oluşturalım...

index.php

<!-- Tarayıcı ön belleğinde tutulmaması için no-cache -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//TR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="TR" lang="tr">
    
<meta http-equiv="Pragma" content="no-cache" />
    
<meta http-equiv="Expires" content="-1" />
    
<title>wmturk.net - Resim doğrulama uygulamasına ait demo</title>
    
<form method="post" action="result.php">
        Dogrulama Kodu: 
<img src="img.php" height="25" width="75" />
        Doğrulama Kodunu Giriniz: 
<input size="6" maxlength="6" name="kod" type="text" />
        
<input value="Test et" type="submit" />
    
</form>
</body>
</html>

Şimdi oluşturacağımız img.php ile resmi alacağız..

img.php

/*Öncelikle oturumu başlatmamız gerekiyor ki sayfalar arası veri transferi yapılabilsin...*/
<?php
session_start();
...
?>

/*Rasgele bir sayı üretip md5 şifreyelim.Bu şifreli veri 32 digit olacağı için bunun 6 digitini alalım...*/

...
$uret=md5(rand(0,999));//0-999 arası sayı üretilip md5 şifrelendi...

$dogrulama_kod=strtoupper(substr($uret,3,6)); // bu şifreli verinin 3. indisinden itibaren 6 digit al ve büyük harfe çevrildi...

/*Session variable ları atayalım...Bu değeri diğer sayfalarda kullanabileceğiz...*/

$_SESSION['d_kod']=$dogrulama_kod;

/*Şimdi ise resmin boyutları belirleyerek oluşturalım..*/

$en=75;
$boy=25;

$img=imagecreate($en,$boy);

/*Kullanabileceğimiz renkleri oluşturuyoruz...*/

$beyaz = ImageColorAllocate($img, 255, 255, 255);
$siyah = ImageColorAllocate($img, 0, 0, 0);
$kirmizi = ImageColorAllocate($img, 242, 0, 0);

/*Arka planı da beyaz yapalım...*/

ImageFill($img, 0, 0, $beyaz);// 2. ve 3. parametreler x,y koordinatlarını ifade eder.

/* Kodu  resmin üzerine entegre edelim...*/

ImageString($img, 6, 9, 5, $_SESSION["kod"], $siyah);

/*Görüntüyü zorlaştırmak adına resmin içerisine çizgiler çizebiliriz...*/

imageline($img, 0, 2, $en, 2, $kirmizi);
imageline($img, 0, 25, $boy, 0, $kirmizi);
imageline($img, $en, $boy, 40, 0, $kirmizi);
imageline($img, 0, 23, $en, 23, $kirmizi);

/*Resmin formatı belirtilir...*/

header("Content-Type: image/jpeg");
ImageJpeg($img);

/*Oturumu bir defaya mahsus kullandığımız için kapatalım..ve çıkış yapalım...*/

session_destroy($img);
exit();



Bu  aşamada sayfanın güvenlik kodları oluşturulmuş oldu...

Son olarak kod doğrulaması yapalım. 

result.php :

/*Oturumu başlatalım öncelikle...*/

<?php
session_start();
// Eger form doldurulmussa
if (isset($_POST['kod'])) {
    
if (strtoupper($_POST['kod']) == $_SESSION['d_kod']) {//güvenlik kodu ve girilen kod karşılatırılır...
        
echo '<h4>Tebrikler, Doğru kodu girdiniz: <code>' . $_POST['kod'] . '</code></h4>';
    
} else {
        
echo '<h4><code>' . $_POST['kod'] . '</code>Hatali giris, tekrar deneyiniz. ' .$_SESSION['d_kod'] . '</h4>';
    
}
    
echo '<a href="index.php">Tekrar _fcksavedurl=""index.php">Tekrar" _fcksavedurl=""index.php">Tekrar" dene?</a>';
} else {
    
?>
    <a href="index.php">Sadece post verileri ile calisan bir sayfadir. Giris sayfasina donebilirsiniz.?</a>
<?php
}
?>

 şeklinde kodlanırsa girilen guvenlik kodunu testi yapılmış olur...

  Bu arada dikkat edilmesi gereken bir nokta ise; kullanıcının güvenlik kodunu doğru fakat küçük harflerle girmesi durumunda da güvenlik kodu doğru kabul edilecektir..