İsmail Kırbaş ile Tasarım Yolculuğu [AnaSayfa] İsmail Kırbaş ile Tasarım Yolculuğu [AnaSayfa] İsmail Kırbaş ile Tasarım Yolculuğu [AnaSayfa]
 Site Haritası 
 
Site Map
Ana SayfaYeriniz | Ana Sayfa | Makaleler | Programcılık | PHP | Web Formları İçin Güvenlik Kodu Oluşturma

Diğer Yazılar
Yapı Taşları
PHP de Dosya İşlemleri
PHP de Metin Düzenleme İşlemleri
Operatörler
Fonksiyonlar
Veri Aktarımı
Sekmeli Menü 1
Sekmeli Menü 2
Hızlı RSS Hazırlama
PHP ye Giriş
PHP ye Giriş 2
Php ile COM Port Kontrolü
Kaya Sağlamlığında Kodlama


E-posta Gönderin Yorum Yazın
Güvenlik Kodu:7525Güvenlik Kodu:7525Güvenlik Kodu:7525Güvenlik Kodu:7525




En Son Okunan 10 Makale
  1. İş Dünyasında Strese Dayanıklılık
  2. İnternette Marka Olmanın Anahtarları
  3. Zirveye Götüren Yönetim
  4. Soru Sormak
  5. İletişim Türleri
  6. Dr. Hakkı Öcal
  7. Uzaktan Masaüstüne Erişmek
  8. Güvenlik ve Kriptografi
  9. PKI ve Dijital İmza Uygulamaları
  10. Web Tasarımında Yardımcı 15 Web Sitesi
 
Web Formları İçin Güvenlik Kodu Oluşturma>
Yazı Tipi KüçültYazı Tipi BüyütAna SayfaYazıcıdan ÇıkarPDF Belgesi Olarak GörüntüleFavorilerime EkleArkadaşıma Tavsiye EdeceğimRTF (Word Dokümanı) olarak görüntüle

Bilhassa BT sektöründe çok telaffuz edilen bir cümle vardır: "Kötü adam bir adım öndedir". Genelde virüs programcılarından bahsedilirken kullandığımız bu cümle artık çoluk çocuk herkesin uğraştığı site kırma (hack), sunucu göçertme (buffer overload), istenmeyen mail gönderme (spam) gibi sakıncalı işlerin müellifleri için de söylenir oldu.

Kötü adamın her bulduğu açık için bir önlem almak da BT'cilerin görevlerinden biri oluyor ister istemez. Bazı web formlarında "kullanıcı adı, parola, il, ilçe" gibi tanıdık bilgilerin yanısıra sık sık görmeye başladığımız "güvenlik kodu" da işte bu önlemlerden biri.

Çeşitli amaçlara sahip kötü adamlar hazırladıkları yazılımlarla siteyi ziyaret etmeden sitedeki "üye başvuru formu", "giriş (login) formu", "sms gönderme formu" gibi formları otomatik dolduruyorlar ve bu sayede sitenin sunucularından aşırı istekte bulunuyorlar. Yapılan düzeneğe göre sitenin web, veritabanı gibi sunucuları zorlanmaya çalışıldığı gibi, bazı durumlarda sadece sitenin sunduğu bir hizmeti siteyi ziyaret etmeden, el değmeden, form doldurmadan kullanmak da istenmiş olabiliyor.

Ne amaçla olursa olsun bu tür işlemler site sahipleri tarafından hoş karşılanmaz. İşte yukarıda geçen bu durumları ortadan kaldırabilmek için web formlarına bir "insan faktörü" katmak şuan için bir çözüm olarak görünüyor. Yani mutlaka bir insanın bizzat doldurmak zorunda olduğu bir alanı formumuza koymakla kendimizi bir nevi garantiye almış oluyoruz. Ama yazının başında da belirttiğimiz gibi kötü adam her zaman bir adım öndedir. Yarın ne ile karşımıza çıkacağı belli değil.

Güvenlik Kodu'nun teknik hikayesi kısaca şu şekildedir: Anlık olarak rastgele üretilen birkaç karakterlik bir kod resim halinde formda görüntülenir, günümüzün teknolojisi resim dosyalarından karakterleri algılamaya da (recognizing) izin verdiği için kodları resmin üzerine muntazam bir şekilde değil, mümkün olduğunca eğri büğrü (ama en azından insanın algılayabileceği kadar açık) yazmak icab etmektedir. Bu yanıltma işlemi için çeşitli yöntemler vardır: Resmi bulandırmak, üzerine eski Türk sinemalarındaki gibi çizikler koymak, karakterleri orasından burasından çekiştirmek yada karakterlerin her birini belli bir açı ile yazmak gibi..


Mynet Güvenlik Kontrolü


Mutasyon.Net Güvenlik Kontrolü


Yahoo Güvenlik Kontrolü


Hotmail Güvenlik Kontrolü

Resim dosyası otomatik olarak oluşturulurken, resimde kullanılan kod, web sunucunun oturum (session) özelliği sayesinde bir değişkende tutulur. Formda resim dosyasında görülen kodların girilmesi için bir text alan bulundurulur. Formdan gelen bilgiler işlenmeye başlanmadan önce ziyaretçi tarafından elle girilen bu kodun, oturum değişkenlerinde sakladığımız kodla aynı olup olmadığına bakılır. Aynı ise; "bu kesin elle bizzat doldurulmuş bir formdur" deyip form gönül rahatlığı ile işleme alınır. Aksi halde uyarı verilip formu tekrar doldurması istenir ve resim tekrar oluşturulur.

İşin hikaye kısmı bu kadar. Zaten asıl önemli olan resmi anlık otomatik olarak oluşturmak. Onun dışında kalanlar klasik programlama işlemleri sayılır.

Anlık Resim Üretmek
Kullandığımız sunucu tabanlı programlama dilinin bize sunduğu resim (image) fonksiyonları vardır. Bilhassa PHP bu konuda oldukça zengindir. PHP'nin resim fonksiyonları sayesinde bir kaç satırlık bir kodla istediğimiz ebatta ve biçimde resmimizi oluşturabiliyoruz.

Yeterince lafı uzattık. Artık kollarımızı sıvayıp kod yazmaya başlayalım :)

Oturum (Session)
Oturum, bir ziyaretçinin web sitemize geldiği andan tarayıcısını (tüm pencereleri ile beraber) kapatıncaya kadar geçen süreye denir. Sunucu üzerinde tutulan küçük bir dosya sayesinde her ziyaretçiye bağımsız bir kod atanır. Bu dosyada yazan kodun (session_id) barındığı küçük bir çerez (cookie) dosyası da ziyaretçinin bilgisayarına bırakılır. Ziyaretçi sayfadan sayfaya dolaştıkça bu çerezdeki bilgi sabit kalacağından (oturum id'sini barındıran çerez ziyaretçinin tarayıcısını kapatana kadar kalacak şekilde ayarlanmıştır) sunucuda hangi oturum id'sinin bu ziyaretçiye ait olduğu kolayca anlaşılır ve o dosyada tutulan bütün değişkenler ziyaretçi siteden çıkıncaya kadar tutulmuş olur.

Bilhassa parola denetimli sitelerde (alışveriş siteleri, forumlar vb) ziyaretçinin birçok sayfayı parola denetiminden geçmiş bir şekilde ziyaret etmesi gerekir. Elbette kimse her sayfada kullanıcı adı ve parolasını girmek istemeyecektir. Bunun için bir kere güvenli giriş yapan ziyaretçinin bilgileri oturum değişkenlerinde tutulur, diğer sayfalar ziyaret edildiğinde önce oturumda bilgiler var mı ona bakılır. Eğer bilgiler tutarlıysa güvenli bir şekilde sayfa ziyaretçiye gösterilir. Aksi halde tekrar giriş yapılması istenir.

Bu yazıdaki uygulamamızda bir giriş sayfamız var, klasik olarak ziyaretçiden "kullanıcı adı" ve "parola" girmesini istiyoruz. Fakat bu giriş bilgileri bir forum, webmail, yada alışveris sitesine giriş için değil, örneğin SMS gönderme programına giriş için kullanılacak olsun (yani kötü niyetlilerin daha çok rağbet edeceği bir giriş formu).

Yukarıda belirttiğimiz insan faktörünü kullanmak için formumuza bir adet resim tagı ( <img> ) bir adet de "güvenlik kodu" isminde bir form alanı koyuyoruz.

Formu ziyaretçiye göstermeden önce oturum'u başlatıp rastgele bir kod üretiyoruz ve bu kodu oturum değişkenine saklıyoruz.

<?
session_start
();

$ses_guvenlik_kodu = rand(111111,999999);            
session_register("ses_guvenlik_kodu");
?>

Formda kullandığımız <img> tagında harici bir jpeg dosyayı değil, o jpeg dosyayı anlık olarak oturumdaki kodu ihtiva edecek şekilde üretecek olan php dosyasını (resim.php) kullanıyoruz.


<form action="act.php" method=post>
Kullanıcı:
<input type=text value="hcivelek" name="kullanici">
Parola:
<input type=password value="123" name="parola">
<img src="resim.php">
Güvenlik Kodu:
<input type=text name="guvenlik_kodu">
<br>
<input type="submit" value="Gönder">
</form>

PHP ile Anlık Resim Üretme
PHP'nin resim (image) fonksiyonları çok kolay bir şekilde resim üretmeye imkan tanımaktadır. Bir resim dosyası üretirken ilk yapmamız gereken şey dosyanın başlık bilgisi olarak "bu bir resim dosyasıdır" demektir. Bu sayede resmi oluşturan datanın sanki düz metin dosyasıymış gibi ekranda görüntülenmesine engel oluyoruz. Bunu php'nin "header()" fonksiyonu ile şu şekilde sağlıyoruz:

<? header("Content-type: image/jpeg"); ?>

Daha sonra sırasıyla aşağıdaki komutları uygulayarak resmimizi oluşturuyoruz. İlgili açıklamalar kodla birlikte verilmiştir.

<?
session_start
();
$text=@$ses_guvenlik_kodu;

header("Content-type: image/jpeg");

/* istediğimiz ebatlarda
boş bir resim oluşturalım */
$im = imagecreate(150, 40);

/* resimde kullanacağımız renkleri
RGB değerlerini kullanarak tanımlayalım */

$grey = imagecolorallocate($im, 0, 0, 0);


/* PHP, TrueType fontları kullanmamıza izin veriyor.
Bu örneğimizde geçerli değil ama, TrueType fontlar
sayesinde Türkçe karakter sorunu yaşamamış oluyoruz; tabi
Türkçe karakterleri olan bir font kullanmak şartıyla */

$font1 = 'arial.ttf';

/* Bu örnekte curlz.ttf (Curlz MT) fontunu tercih ettik. Böylece doğal kıvrımlı yapısı sayesinde kendimiz eğip bükmekten kurtulmuş olduk. */
$font2 = 'curlz.ttf';

/* imagettftext (resim_id, font boyu, açı, x koordinat, y koordinat, renk değeri, font dosyası, metin). */
imagettftext($im,8,0,10,10,$black,$font1,"Güvenlik Kodunuz");


/* Rastgele üretilen güvenlik kodunun yazılmaya başlanacağı koordinatlar */
$x=11;
$y=30;

/* Yukarıda oluşturulan kodun her bir karakterini farklı açılarda (bir önceki harfle çakışmasın diye belli bir boşluk bırakarak) yanyana yazıyoruz. Bunu bir döngü ile de yaptırmak elbette mümkün. Fakat zaten sadece 6 karakter kullandığımız için her birini keyfi açılarla elle doğrudan yazmayı tercih ettik. Burada; sahip olduğunuz paranoya derecesine göre güvenliği artırmak için karakterden karaktere fontun büyüklüğü ile de oynayabilmek mümkün. */
imagettftext($im, 20, -4, $x, $y, $grey, $font, substr($text,0,1) );
imagettftext($im, 20, 0, $x, $y+2, $grey, $font,  "  ".substr($text,1,1));
imagettftext($im, 20, 4, $x, $y+1, $grey, $font,  "    ".substr($text,2,1) );
imagettftext($im, 20, -6, $x, $y+1, $grey, $font, "      ".substr($text,3,1));
imagettftext($im, 20, -3, $x, $y+1, $grey, $font, "        ".substr($text,4,1));
imagettftext($im, 20, -5, $x, $y-2, $grey, $font, "          ".substr($text,5,1));

?>

Resmimizi hemen oluşturduk. Sıra geldi bu resmi tarayıcı (browser) göndermeye.

<?

/* imagejpeg() fonksiyonu ile birlikte resmimizi tarayıcıya göndermiş oluyoruz */
imagejpeg($im);

/* imagedestro() fonksiyonu, sunucuda bu resim oluşturma işlemi için
kullanılan hafıza bölgesinin serbest bırakılmasını sağlıyor. Böylece sunucudaki yükü de azaltmış
oluyoruz */

imagedestroy
($im);

?>

Formdan gelen veriler işlenmek üzere act.php'ye gönderilir. Burada form bizim istediğimiz gibi birileri tarafından bizzat mı doldurulmuş ve bilgiler doğru mu girilmiş onu kontrol ediyoruz. Şartlar uygunsa ziyaretçiyi güvenli bölgeye kabul ediyoruz. Aksi halde oturum bilgisini temizleyip ziyaretçiyi tekrar giriş formu sayfasına yönlendiriyoruz.

<?
session_start
();

$db_kullanici="hcivelek";

$db_parola=123;


if(
$kullanici==@$db_kullanici and $parola==@$db_parola and @$ses_guvenlik_kodu==$guvenlik_kodu)

    
$cikti= "Merhaba <b>$db_kullanici</b><br>;    

else
{
    
$ses_guvenlik_kodu="";
    
session_register("ses_guvenlik_kodu");
    
$cikti= "Giriş bilgileriniz kabul edilmedi!<br><a href="index.php">Tekrar Dene</a>";
}

?>



Bu yazıda paylaşacaklarımız bu kadar, web sitelerinizin her zaman güvenlik içinde ve sorunsuz çalışmalarını dileriz..



Not: Yazılar konusundaki yorumlarınız için lütfen Yorum Yazın bölümümüzü kullanın.

Yazar : Hasan Civelek
Son Güncelleme : 22 Eylül 2005, Perşembe
Sayfa Sürümü : 1
Okunma Adedi : 13,024
Son Okunma : 2017-07-23 02:11:09
Kaynaklar : http://www.bthayat.net/site/yazi_goster.php?id=334

Hızlı RSS HazırlamaWeb Formları İçin Güvenlik Kodu OluşturmaPHP ye Giriş
© [Site Haritası]
| Makaleler | Seyir Defteri | Kaynaklar | İndirin | İletişim |

RSS dosyasını görmek için tıklayınız. RSS dosyasını görmek için tıklayınız.XML versiyonu için tıklayınız WAP versiyonu için tıklayınız Bu site DyNA İçerik Yönetim Sistemi üzerinde çalışmaktadır.
İsmail KIRBAŞ ile Tasarım Yolculuğu Anasayfa İsmail KIRBAŞ ile Tasarım Yolculuğu Anasayfa İsmail KIRBAŞ ile Tasarım Yolculuğu Anasayfa
ismail kırbaş ile web sitesi tasarimi sitemap ismail kırbaş ile web sitesi tasarimi sitemap
  Sitemizde 12 kişi çevirimiçi | Bugün =247 | Dün =357 | Bu Ay=6,631 | Günlük En Fazla=1,109 tekil ziyaretçi