Harmankaya Logo

PHP İle Resim Doğrulaması-Güvenlik Kodu Oluşturma

ARA 01

Saat: 10:33:39 Gösterim: 7187

resim dogrulaması captchaDüşündüm de ne zamandır eğitim amaçlı birşeyler yazmıyorum. Bi baktım 2 gündür de yazı yazmıyormuşum, dedim bugun birşyler paylaşıyım ziyaretçilerimle. İlk php ye başladığım zamanlar mantığını bir türlü oturtamadığım Türkçemize Resim Doğrulama olarak da çevirebileceğimiz Captcha dan bahsediyorum bugün biraz.Captcha ise aslında bir cümledeki kelimelerin baş harflerinin alınması ile elde edilmiş bir kelime:"completely automated public Turing test to tell computers and humans apart" Böyle soru-cevaplı olarak gitmeyi düşündüm bu anlatımımda.

  • Resim Doğrulaması Nerelerde Kullanılır?

Genel olarak web sayfalarının POST gönderilme yerlerinde kullanılır. Mesela yazı gönderme, yorum gönderme, iletişim kurma, mail gönderme vs gibi yerlerde.

  • Resim Doğrulaması Kullanmanın Avantajları Nelerdir?

Resim doğrulamasının kullanılmasındaki amaç Flood yapan yani arka arkaya post ederken sunucunun bir zaman sonra bu isteklere cevap veremeyerek kapanması( down olması)nı sağlayan programların kullanılarak sistemimizin zarar görmesini engellemek. Web sitenize giren kötü amaçlı şahıslar sitenizdeki bir iletişim formunu kullanarak veritabanınıza anında yüzlerde kayıt ekleyebilirler.

  • Bu Sistem Ne Kadar Güvenli?

Şöyle söyleyebilirim ki kendi fikrimce iyi hazırlanmış bir resim doğrulaması günümüzde Flood için en iyi önlem diyebilirim. Bundan farklı uygulamalar da var. Örneğin; sesli doğrulama, işte matematiksel işlem yaptırma gibi...

Şimdi ise nasıl kullanıyoruz ve çalışma mekanizması nasıl buna gelelim biraz da,

Duruma birazcık basit yaklaşırsak, elimizde bir formumuz var ve bu formun bir insan tarafından doldurulduğunu anlamak istiyoruz. Hemen bu iş için biçilmiş kaftan Captcha yı kullanıyoruz. Yani kullanıcıya bir takım kodlar üreteceğim mesela HF93HD93 gibi ve bu kodları aynı gönderdiği formda birlikte postalamasını isteyeceğim.

Şimdi duruma şu tarafından bakarsak eğer Form gönderilirken "yan taraftaki kod buraya yazın" gibi bir ibare kullanılıp kod da  text olarak sunulsaydı bir program yardımızla rahatça parse edilip o kodu aynı flood programına yazdırabilirdiniz.

Peki o zaman bizim için gerekli olan şey kodu bir Resmin üzerine yazmak ve Parse edilmeyi oldukça zorlaştırmak.Yani resim işlenilip yine o kod bulunabilir ama en azından saldırganın işi uzar.

Peki esas mantığımızı anladık bir kod oluşturcaz ve o kodu SESSION olarak atayacağız. Hani aklımızda tuttalım da adam kodu yazdığında gerçekmi diye kotrol edeceğiz. Şimdi gelelim Resim.php yani işte FDS7F7SD gibi abuk subuk harf-rakam(alfanümerik) kümesinin nasıl oluşturulduğuna.

Kısaca kodu vereyim

*********************************************************************

///resim.php olarak kaydet///////

///Resim.php her çalıştırıldığında farklı şifre türetecek bir fonksiyon oluşturuyoruz. 

function olustur () {
 $sifre = substr(md5(rand(0,999999999999)),-6);
 if ($sifre) {
  session_start();
  $_SESSION["koruma"] = $sifre; //oluşturulan şifre session'a aktarılıyor
  $yaz=$_SESSION[koruma];
  $say=strlen($yaz);
  for ($i=0; $i<=$say; $i++) {
    $a .= $yaz[$i]." ";
  }
  //Fontlarin Oldugu Klasörü Tanitiyoruz
putenv('GDFONTPATH=C:\WINDOWS\Fonts');
 
//Kullanmak Istedigimiz Yazi Tipinin Adi
  $yazitipi = 'verdana.ttf';
  $width  = 120;
  $height =  25;
  $resim = @imagecreate ($width,$height);//resim dosyası oluşturuluyor
  $beyaz  = ImageColorAllocate($resim, 255, 255, 255);
  $rand   = ImageColorAllocate($resim, 141, 43, 250);
  ImageFill($resim, 0, 0, $rand);
 
  // farkli büyüklükte resim olusturuyoruz
 
  imagechar($resim,16,15,8,$sifre[0],$beyaz);//sifreyi nin 0. karakterini resmin farklı bölgesinde gösteriyorz. vs..

imagechar($resim,18,35,8,$sifre[1],$beyaz);

imagechar($resim,15,55,8,$sifre[2],$beyaz);

imagechar($resim,10,65,8,$sifre[3],$beyaz);
imagechar($resim,15,85,8,$sifre[4],$beyaz);
imagechar($resim,18,105,8,$sifre[5],$beyaz);
imagechar($resim,18,105,8,$sifre[6],$beyaz);

 


  header("Content,type: image/png");
  ImagePng($resim);
  ImageDestroy($resim);//oluşturulmuş resim geçiçi idi artık yer kaplamasın diye siliyoruz
 }
}
olustur();//farklı bir şifrenin oluşturulmasını sağlar

**************************************************************

Şimdi yukarıda örnekteki kodları php doyası olarak kaydettiğinizde artık resmi göstermeye 1 adım daha yaklaştınız demektir. Yapmanız gereken <img src="resim.php" .... şeklinde resmi göstermek. Unutmayın resmi her gösterdiğiniz resmin üzerindeki kod SESSION'a yazılıyor. TamamdırLaughing

Sıra geldi kontrolümüze. İşte en kolay kısımda burası:

if($_SESSION[koruma]!=$_POST[guvenlik])

{

echo "hatalı güvenlik kodu"; 

 

Umarım anlatabilmişimdir. Bu arada makeleyi anlayabilmek için azda olsa php bilginizin olması gerekiyor :)

Captcha ile ilgili yararlanabileceğiniz kaynaklar.

http://recaptcha.net/whyrecaptcha.html

http://tr.wikipedia.org/wiki/CAPTCHA

Detaylı BilgiArkadaşına GönderYazıcıya Aktar


İM'le

Yorumlar( 14 )

Yorum Gönder

#1 gönderenGönderen: Emo gönderme zamanıZaman: 12:49:22/

Çok sağol nasıl yapılıyor diye merak etmişimdir hep


#2 gönderenGönderen: Gürsu gönderme zamanıZaman: 18:13:27/

Blogumda deneyeceğim.Umarım becerebilirim


#3 gönderenGönderen: Murat gönderme zamanıZaman: 18:50:07/2008-06-13

çok teşşekkür ederim. Bir sorum olcak ben bu kodları kullandığımda türkçe karakter sorunu ile karşılaşıyorum


#4 gönderenGönderen: Erhan gönderme zamanıZaman: 01:26:01/2008-06-14

Merhaba, türkçe karakter sorunu nerede yaşıyorsunuz anlamıyorum ?. Yani çıkan karakterler zaten türkçe karakter içermiyor. Sadece şifre oluşturuluyor.


#5 gönderenGönderen: Uğur gönderme zamanıZaman: 16:59:18/2008-06-30

Bu güvenlik kodu uygulamasını veri tabanıyla nasıl bağlantılayabiliriz.
kodu yanlış giriyorsa veri tabanına veri eklenmesin gibi.
uğraştım uğraştım yapamadım.
kodu doğruda girsem yanlışta girsem veri tabanına kaydediyor.


#6 gönderenGönderen: Erhan gönderme zamanıZaman: 10:46:47/2008-07-01

if($_SESSION[koruma]!=$_POST[guvenlik])

{

echo "hatalı güvenlik kodu";

}


buradaki echo "Hatalı güvenlik kodu ";

kısmı güvenlik kodunun yanlış girilmesi durumundaki işlenecek bölümdür. Buraya
veritabanına veri ekleyen kodu yapabilirsiniz.


#7 gönderenGönderen: hisbab gönderme zamanıZaman: 14:02:37/2008-07-02

Çok teşekkür ederim, acil lazımdı ;)


#8 gönderenGönderen: nema problema gönderme zamanıZaman: 18:39:23/2008-09-11

yahu çalıştıramadım kaydet.php'me postluyorum verileri oraya yolladıktan sonra kod hatalı kısmına bir de session'daki güvenlik kodunu ve formdan yolladığım kullanıcının yazdığı kodu değişkenlere atayıp echo ile yazdırıyorum, formdan gelen veride bir problem yok ekrana yazılıyor ancak session değerini atadığım değişken boş gözüküyor bir değer yok. Yani session'a kod atanmıyor. Resim falan gözüküyor bu durumda yazdığın kodlarda hata yok. Aklıma bir tek bunu localhostta çalıştırdığım için problem oluşturuyor olabileceği geliyor. Bir de hosta atıp deneyeyim diyorum ama yine de ümitli değilim..


Şöyle bir kodum var
***********************
$dene1=$_POST[guvenlik];
$dene2=$_SESSION[koruma];
if($_SESSION[koruma]!=$_POST['guvenlik'])

{

echo "hatalı güvenlik kodu<br>";
echo "$dene1 dene1<br>";
echo "$dene2 dene2";
}

****************

calistirdigimda ekrana;

hatal&#253; güvenlik kodu
123123 dene1
dene2

yazıyor yani sesion boş. Anlatabildim mi bilmiyorum ama cevabını bekleyeceğim..


#9 gönderenGönderen: nema problema gönderme zamanıZaman: 18:45:39/2008-09-11

Değişen birşey olmadı hostta'da aynı sorunu verdi, incelemek istersen link; kabakca.com/kayit.php

bu arada inceledikten sonra bu mesajı silersen sevinirim..


#10 gönderenGönderen: nema problema gönderme zamanıZaman: 18:47:34/2008-09-11

birşey daha farkettim güvenlik kodunu boş bıraktığımda sorun çıkmıyor bu da sessiondaki değerin boş olduğunu kesinleştiriyor. Kodları aynen kopyaladım nerde hata yapıyorum aceba :S


#11 gönderenGönderen: nema problema gönderme zamanıZaman: 01:35:16/2008-09-12

Hatamı buldum arkadaşlar, formdaki bilgileri gönderdiğim yani kayit.php sayfamın en üstüne

session_start();

yazmayı untmuşum, oturum açılmadan nasıl veri yazılsın ya da çekilsin ki =)


#12 gönderenGönderen: Fatih gönderme zamanıZaman: 10:58:51/2008-12-10

Selamlar,
Benim de benzer bir koda ihtiyacım oldu ancak img src=resim.php bana bir resim oluşturmuyor malesef
nerede yanlış yapıyor olabilirim?

şimdiden teşekkürler

Fatih


#13 gönderenGönderen: Erhan gönderme zamanıZaman: 10:06:42/2008-12-11

Sunucunuzda GD kütüphanesi yüklenmemiş olabilir


#14 gönderenGönderen: Fatih gönderme zamanıZaman: 22:50:10/2008-12-11

Haklısınız ben gd kütüphanesinin gerekli olduğunu bile bilmiyormuşum, biraz araştırıp kendi makinemde sorunu hallettim ancak sunucuya yüklediğimde çalışmıyor kod, linux bir sağlayıcıdan hosting hizmeti alıyorum, sanırım onların yüklemesi lazım gd kütüphanesini?


Blog Kategori

Son YAZILAR

sON YORUMLAR

Sponsor Reklamlar


Blogging Blogs - BlogCatalog Blog Directory
Personal blogs
Listed in LS Blogs the Blog Directory and Blog Search Engine
Bloggapedia, Blog Directory - Find It!
Blog Directory - photarium
Firefox 2

Hukuk Bürosu

Yusuf Öztürk

Laktoz.Net