Kimler Sitede
Şu anda 8 ziyaretçi çevrimiçiBağış
| PHP de Güvenlik Kodu Uygulaması |
| Makale - PHP | |
| Yazar ugokhan | |
| Salı, 18 Eylül 2007 10:28 | |
|
Bir çok form girişinde uygulanan ve formun spam yazılımlar tarafından kullanılmasını engelleyen bir yöntemdir. Form bilgileri doldurulurken küçük bir resim içerisindeki yazıları bir textbox içerisine yazmamız istenir. Bu resimdeki değerler her seferinde rastgele oluşturulur. Tabiki bunlar hazır resimler değildir. PHP'nin hazır imaj fonksiyonları ile hazırlanır.
Biz de şimdi basit bir güvenlik kodu uygulaması yapalım. Kullanıcılara her gelişlerinde farklı bir oturum açalım ve bir formu doldururken güvenlik kodu girişlerini ayarlayalım. Öncelikle guvenlik kodu resmini çizecek olan bir php fonksiyonu yazalım. Bunu ayrı bir dosya olarak kullanalım. bir guvenlik.php dosyası oluşturarak aşağıdaki kodları yazın.
Şimdi sırayla satırları açıklayalım. function olustur() ifadesi ile fonksiyon oluşturduk.
$sifre = substr(md5(rand(0, 999999999999)), -6); Bu satırda rand() fonksiyonu ile üretilen rastgele değerleri md5() fonksiyonu ile şifreledik. Sonrasında subtr() fonksiyonunu kullanarak bu değerin son 6 karakterini alıp $sifre değişkenimize aktardık. Rand fonksiyonu belirtilen iki sayı aralığından rastgele bir sayı seçer. Biz 0 ile 999.999.999.999 arasında bir sayı seçmesini istedik. Sonra seçilen sayıyı md5 fonksiyonuna gönderdik ve işi daha da karmaşık hale getirdik. md5 fonksiyonu tek yönlü şifreleme yapan bir fonksiyondur ve her kelime için asla bir diğeri ile aynı olmayan 32 karakterli benzersiz şifreler üretir. Elde ettiğimiz 32 karakterli string'in son 6 karakterlik kısmını substr fonksiyonunu kullanarak alıyoruz. if ($sifre) { Bu satır ile $sifre değişkenimiz TRUE (doğru) döndüyse yani bir değer elde edildiyse işlemlere başla dedik. session_start(); Oluşan değeri bir oturum değişkenine kaydedebilmek için oturumumuzu başlattık. $_SESSION["guvenlik"] = $sifre; Rastgele oluşturduğumuz $sifre değişkenimizi bu satırda $_SESSION["guvenlik"] oturum değişkenimize atadık. Böyle yapmamızın nedeni diğer sayfalarda buna ulaşabilmek. Eğer ki oluşan değeri bir txt yada benzeri bir şeyde tutsaydık bunu bulup güvenliğimizi delip geçebilirlerdi.
$width = 100; Bu iki satırda ise oluşturacağımız güvenlik resminin en ve boy değerlerini belirliyoruz. Yani resmimiz 100 x 30 boyutlarında olacak. $resim = ImageCreate($width, $height); Bu satırda ImageCreate() fonksiyonu ile belirlediğimiz ölçülerde bir resim yaratıp bunu $resim değişkenine atıyoruz.
$beyaz = ImageColorAllocate ($resim, 255, 255, 255); Bu satırda ise ileride kullanabilmek için bir renk tanımladık ve rengimizi $beyaz değişkenine atıyoruz. $rand = ImageColorAllocate($resim, rand(0,255), rand(0,255), rand(0,255)); Bu satırda bir önceki işlem gibi bir renk tanımladık fakat farklı olarak bu satırda tanımladığımız renk sürekli değişen bir renktir. Bildiğiniz gibi RGB renk paletindeki renkler 0 ile 255 arasında bir değer alır. Biz de burada Rand fonksiyonu ile 0-255 arası rastgele bir değer ürettik ve bunu renk parametresi olarak kullandık. Yani her seferinde rastgele bir renk oluşacak. ImageFill($resim, 0, 0, $rand); Bu satırımızda ImageFill() fonksiyonunu kullanarak, oluşturmuş olduğumuz resmin arkaplan rengini belirledik. Ve bu sürekli değişen bir arka plan olacaktır. Eğeri isterseniz siz bunu sabitleyebilirsiniz. Görüntü koordinatları, sol üst köşeden başlar (x=0, y=0). Görüntünün sağ alt köşesi ise x=$width y=$height dir. Geometri dersindeki koordinat sisteminden farklıdır. Neredeyse tüm program dillerinde bu bir standarttır. Belki bilmediğim istisnalar olabilir diye neredeyse ifadesini kullandım. Zira ben şimdiye kadar bundan farklı bir koordinat sistemi görmedim. ImageString( $resim, 5, 24, 7, $_SESSION["guvenlik"], $beyaz ); Bu satırda ise ImageString() fonksiyonu ile tanımlamış olduğumuz resim dosyasında belirlediğimiz koordinatlara daha önceden elde ettiğimiz kodu resmimizin üzerine yazdırıyoruz. Burada yazılan yazının rengi beyazdır. Ayrıca 24 ve 7 değerleri x ve y koordinatlarını temsil etmektedir. Yani yazı (24,7) koordinatından başlayacak. Yazı fontu ise 5 olarak tanımlanmıştır. Yazı fontu 1 ile 5 arasında değer alabilir. Bunlar standart olarak gelen yerleşik font numaralarıdır. Biz burada 5 nolu fontu kullanmış olduk. ImageLine($resim, 100, 15, 0, 15, $beyaz); Burada ise oluşturduğumuz resmimize bir çizgi çiziyoruz. Amacımız yazdığımız yazının okunabilirliğini biraz zorlaştırmak. Çünkü özel bot yazılımları ile bu güvenlik resimlerini okuyabilirler. Bir yazının okunabilirliği ne kadar kötü ise botlardan etkilenme ihtimaliniz de o kadar azalır. Çizgi oluşturmak için 4 tane parametre kullanıyoruz. Biraz geormetriyi hatırlayın. Bir doğru parçası çizmek için 2 tane noktaya ihtiyacımız var. Her noktanın da 2 tane koordinat değeri var. Yani x ve y. Ne yaptı toplam 4 tane koordinat ölçüsü vermemiz lazım. Şimdi anladınız mı lise öğretmeninize "bu bilgiler gerçek hayatta ne işimize yarayacak" demenizin ne kadar hatalı olduğunu :) Neyse, ilk noktamızın koordinatı (100, 15) 'dir. Diğer noktamızın koordinatı ise (0,15) 'tir. Siz bu değerlerle oynayabilirsiniz ve daha değişik çizgiler elde edebilirsiniz.
header("Content,type: image/png"); Resmimiz değişken üzerinde oluştu. Artık oluşan resmimizin tipini belirleme vakti. Ben png formatını seçtim. Siz isterseniz jpeg olarak da belirleyebilirsiniz. ImagePng($resim); Bu satırda ise oluşturduğumuz resmi ekrana basıyoruz... ImageDestroy($resim); En son olarak ImageDestroy fonksiyonu ile resmimiz için ayrılan belleği boşaltıyoruz. olustur(); diyerek oluşturduğumuz fonksiyonu çalıştırıyoruz. Artık guvenlik.php dosyamız hazır. Şimdi basit bir form tasarlayalım. Adı form.php olsun.
Burada dikkatli olmamız gereken şey şu: Oluşan resmimizi <img src="/guvenlik.php"> şeklinde kullanmalıyız. Eğer guvenlik.php dosyasını normal PHP dosyaları gibi sayfaya include etmeye kalkarsanız ekranda resim yerine abuk subuk karakterler görürsünüz. Oluşturduğumuz guvenlik.php dosyası sanki bir resim dosyasıymış gibi davranacaktır.
Sıra geldi formumuzun işleneceği kontrol.php dosyasını hazırlamaya. Form bilgileri buraya gidecek ve bu dosyada kontrol edilecek.
İlk satırda oturum başlatıyoruz. Zaten oturum kontrolü yapabilmek için her sayfada mutlaka session_start() işlemini en başta yapmalısınız.
if (empty($_POST["kod"]) || empty($_SESSION[“guvenlik”]) || !$_SESSION[“guvenlik”]) { Bu satırda kötü niyetli kişilerin direkt güvenlik kodumuzu geçmelerini engellemek için bir dizi güvenlik satırı yazdık. Eğer güvenlik kodunun yazılması gereken input kutusuna bu bilgi yazılmadıysa ve form gönderildiyse kod değişkeni boş olacaktır. Veya herhangi bir nedenle form sayfasına uğramadan direkt olarak kontrol.php ye gelindiyse session üzerindeki guvenlik değişkeni oluşmamış ve boş durumda olacaktır. Tüm bu hallerde işlem iptal edilir ve tekrar giriş formuna gidilmesi için yönlendirme şllemi yapılır. Empty fonksiyonu bir değişkenin değeri boş ise TRUE değeri döndürür.
if ($_POST["kod"] == $_SESSION[“guvenlik”]) { Burada formdan gelen kod değeri ile oluşan ve session değişkeninde sakladığımız guvenlik değerini karşılaştırıyoruz. Eğer bu iki değer birbiri ile uyuşuyorsa yani eşit ise ziyaretçiyi bilgilendiriyoruz ve ardından unset() fonksiyonu ile oluşturduğumuz session oturum değişkenini sonlandırıyoruz. Son olarak da programı sonlandırıyoruz. PHP 'de exit satırı çalıştığı anda programın icrası kesilir. Eğer gelen değer ile session'da sakladığımız değerler birbirine eşit değilse ziyaretçiye "Güvenlik Kodu Hatalı. Lütfen Yeniden Deneyiniz" mesajını veriyoruz.
imagettftext( $resim, 20, 0, 20 , 28, $renk, 'tahoma.ttf', $yazi ); Burada $resim adlı resim üzerinde tahoma font dosyası çağrılarak $yazi değişkenindeki yazı yazdırılır. Diğer parametreler sırasıyla font yüksekliği (20), yazının yataydaki açısı (0), x koordinatı (20) ve y koordinatı (28) dir.
|
Yorumlar
üye ekle sayfanızdaki form alanına yukarıda tarif edildiği şekilde ekleme yapabilirsiniz. Bir input alanı oluşturun ve yanına kodunu ekleyin. Güvenlik kodu otomatik olarak oluşacaktır. Gerekli detaylar zaten örnek olarak yukarıda mevcut.
echo "Lütfen Form Sayfasına Gidiniz.";
RSS beslemesi, bu iletideki yorumlar için.