Php ile güvenlik kodu uygulaması

Php ile (captcha) uygulamasına insan faktörünü kontrol etmek için ihtiyaç duyarız. Güvenlik kodu gerçek kullanıcı ile botları birbirinden ayırır. Bazı kötü niyetli kullanıcılar, programlar kullanarak sisteme binlerce gereksiz kayıt girebilirler. Aynı işlemi bot tarzı uygulamalarla da yapabilirler. Bunların önüne geçmek için güvenlik kodu (captcha) uygulamasına ihtiyaç duyarız.

Yapmamız gerekenler: rastgele bir kod oluşturmak, bu kodu resmin üzerine çizmek ve okunurluluğunu zorlaştırmak. Peki, neden kodu resmin üzerine çiziyoruz? Eğer güvenlik kodunu direk sayfaya yazarsak sayfanın kaynağı bir betik ile alınarak rahatlıkla aşılabilir. Bazı programlar güvenlik kodunu kırdığından ya da kırmaya çalıştığından kodun okunabilirliğini de zorlaştırmamız gerekiyor.

Yapabileceklerimiz ise şunlar: Php’nin gd kütüphanesini kullanarak bir resim çizeriz. Resme yazacağımız yazının fontunu zor okunabilen bir font seçeriz. Daha fazlasını istersek resme çizgiler ekleyebilir ya da karışık bir arkaplan resmi kullanarak yazımızı bu resmin üzerine yazabiliriz. Resmin üzerine yazdığımız kodu session’da depolayarak formu işleyeceğimiz sayfada, input alanından gelen kullanıcının girdiği kod ile session’da bulunan kodu karşılaştırarak doğruluk kontrolü yaparız.

Aşağıdaki kodlar resim.php olarak kaydedilebilir.

<?php
// oturumu başlatalım
session_start();

// png olarak çıktılayalım
header('Content-type: image/png');

// yazımızın fontu .ttf cinsinden
$font = 'CheapInk.ttf';

// rastgele karıştırılacak olan string oluşturuyoruz
$numText = '0123456789abcdefghijklmnopqrstuvwxyz';

// rastgele 5 karakterden oluşan kod oluşturuluyor
$randomKod = substr(str_shuffle($numText),0,5);

// Resmi oluşturalım
$resim = imagecreate(100, 40);

// arkaplanı beyaz yapalım
$beyaz = imagecolorallocate($resim, 255, 255, 255);

// yazıyı siyah yapalım
$siyah = imagecolorallocate($resim, 0, 0, 0);

// rastgele oluşturulan metni session'a aktarıyoruz
$_SESSION['guvenlik'] = $randomKod;

// Resme yazıyı yazalım
imagettftext($resim, 20, -10, 10, 25, $siyah, $font, $_SESSION['guvenlik']);

for($i = 0; $i < 5; $i++) {
imageline($resim , rand(1,40), rand(6,20), rand(100,151), rand(1,51), $siyah);
}

// resmi çıktılıyalım
imagepng($resim);

// hafızayı boşaltalım
imagedestroy($resim);

?>

Yukarıdaki kod CheapInk fontunu kullanarak oluşturulan resme rastgele bir kod yazar ve resmin üzerine 5 adet çizgi çeker. Kod içerisinde kısa açıklama yaptığımdan kodu burada ayrıca açıklamıyorum. Eğer betik içinde geçen fonksiyonlar hakkında bilgi almak isterseniz Php kılavuzundan yararlanabilirsiniz. Kullandığımız fontu da aşağıdaki linkini verdiğim örnek dosyayı indirerek edinebilirsiniz. Şimdi de basit bir html formu oluşturup resmimizi çağıralım.

<img src="resim.php" alt="güvenlik kodu" /><br />
<form action="kontrol.php" method="post">

<input type="text" name="guvenlik" id="guvenlik" />

<input type="submit" value="Gönder" name="gonder" id="gonder" />

</form>

Form sayfamız basit bir html formundan oluşuyor. Resmi çağırırken resim adresi olarak resim.php dosyasını gösteriyoruz. Son olarak da doğruluk yapacak olan sayfamızın kodlarını yazalım. Aşağıdaki kodlar kontrol.php olarak kaydedilebilir.

<?php

//oturum başlatılıyor
session_start();

// eğer güvenlik kodu ile post verisi aynı değilse
if($_SESSION['guvenlik'] != $_POST['guvenlik']) {

	echo 'Güvenlik kodunu hatalı girdiniz';

} else {

	// bu yazı yerine veritabanına kayıt işlemleri vs. yapabilirsiniz.
	echo 'Güvenlik kodu doğru';

}

?>

Yukarıda bahsettiğimiz gibi session ile post olarak gelen input verisi birbirini tutuyorsa güvenlik kodu doğru girilmiş demektir. Aksi durumda kod hatalı girilmiştir.

Henüz Yorum Yapan Olmadı

Yorum Yapın