PHP ile Güvenlik Kodu (Captcha) Scripti

Form girdilerini işleme gönderirken kullandığımız güvenlik kodu (capthca) unsuru, gerçek kişileri bot dediğimiz ve çoğunlukla iyi niyetli olmayan örümceklerden ayırmak için kullanılan etkili bir çözümdür. “Peki nedir bu botların derdi? Ne alıp veremedikleri var bizimle?” derseniz, bot olgusunun altında genelde web sayfanıza/e-mail servisinize sahte isimlerle kaydolma, dayatmalı reklam yapma girişimi veye bir takım kodlar göndererek size/web sayfanıza zarar verme mantığı yatmaktadır. Zorla reklam yapmaya çalışan bu gerzekleri anlamadığım kadar (herhalde reklamın iyisi kötüsü olmaz düşüncesine kendilerini fazla kaptırmışlar) neden size durduk yerde zarar vermeye çalıştıklarını da bi türlü anlayamamışımdır. Virüs yazıp ruh hastası yanlarını tatmin etmeye çalışan  insan(ımsı)larla aynı psikolojik durumları yaşadıkları aşina. Kodlarımıza geçmeden önce bu adamları ayıklamak için neden böyle çetrefilli yollara başvurduğumuza biraz değinelim.

Botlar web sayfasında bulunan yazılı metinleri (text) kolayca tarayıp elde ettikleri metin öbeklerini form elemanlarınız üzerinde defalarca deneyerek güvenlik duvarınızı aşmaya çalışırlar, bu yüzden güvenlik kodlarımızı text olarak değil de resim olarak kullanıp böyle bir ihtimale meydan vermeme yoluna gidiyoruz. Fakat adamlar durumu öyle psikopatlık derecesine taşıyıp kendilerini zarar vermek adına o kadar geliştirmişlerdir ki, web sayfasındaki metinleri tarama yöntemini geliştirip ekran okuma tekniğine terfi etmişlerdir, bu da ekranda (ister resim ister metin) okunaklı şekilde yazılan ne varsa bulup tekrar saldırmalarına olanak sağlamaktadır.

Fekat! Zalimin zulmüne yenik düşmeyecek kadar gururlu ve bir o kadar zeki webmaster abilerimiz “ulan hodri meydan!” şeklinde bir serzenişle capthca tekniğini geliştirmişlerdir. Bu da “Lütfen yandaki güvenlik kodunu giriniz” ibaresini gördüğünüz sitelerde, belki canınız sıkılarak “ulan okunmuyo bee” dediğiniz, abidik gubidik anlamsız harf ve rakam kombinasyonlarını ifade etmektedir. Ancak bu “her capthca botlar tarafından okunamaz” anlamına gelmiyor tabi, iyi bir capthca için bir takım kriterler vardır; en önemli unsur insanlar tarafından okunabilen fakat botların algılayamadığı karakterler kullanılmasıdır. Bunun için standart dışı fontlar kullanmanız, zeminde fontun botlar tarafından algılanmasını güçleştirecek unsurlara (çizgiler, noktalar) ve değişik renklere yer vermeniz, her defasında ekrana farklı kombinasyonlar bastırmanız gerekmektedir.

Sözü daha fazla uzatmadan kodlarımıza geçelim. Standart, sabit ölçülerde ve PHP GD kütüphanesini kullanan bir capthca scriptimiz var. Kodlarımız şu şekilde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
session_start();

// Basit Güvenlik Kodu (Capthca) Scripti v1.0
// 70 x 22 ebatlarında statik bir güvenlik kodu scriptidir.
// Görsel ebatı 5 haneli Blurmix fontuna göre ayarlanmıştır.
// Caner ÖNCEL - http://www.egonomik.com

// Resim detaylarını tanımlıyoruz.
    $font = "Blurmix_0.TTF";
    $width = "70";
    $height = "22";
    $hane = "5";

// Kodda kullanılacak olan karakterleri tanımlayan fonksiyon
// 1, 0, o, ı, i, l gibi karakterleri karışıklık yaratmaması için egale ediyoruz.
    function rastgele($text) {
    $mevcut = "abcdefghjkmnprstuxvyz23456789ABCDEFGHJKMNPRSTUXVYZ";
    for($i=0;$i<$text;$i++) {
    $salla .= $mevcut{rand(0,48)}; }
    return $salla; }
    $metin = rastgele($hane);

// Arkaplan resmini oluşturuyoruz
    $resim_yaz=imagecreate($width,$height);
    imagecolorallocate($resim_yaz, 255, 255, 255);

// Metin rengi ve karışıklık yaratmasını istediğimiz diğer renklerini tanımlıyoruz.
    $text_renk = imagecolorallocate($resim_yaz, 29, 96, 146);
    $bg1 = imagecolorallocate($resim_yaz, 244, 244, 244);
    $bg2 = imagecolorallocate($resim_yaz, 227, 239, 253);
    $bg3 = imagecolorallocate($resim_yaz, 207, 244, 204);

    header('Content-type: image/png');
    imagettftext($resim_yaz, 26, -4, 4, 25, $bg1, $font, $metin);
    imagettftext($resim_yaz, 30, -7, 0, 15, $bg2, $font, $metin);

// Arka plana rastgele çizgiler yazdırıyoruz.
    for( $i=0; $i<($width*$height)/400; $i++ ) {
    imageline($resim_yaz, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $bg3);  }

// Esasoğlan metnimizi (güvenlik kodu) bastırıyoruz.
    imagettftext($resim_yaz, 14, 3, 7, 17, $text_renk, $font, $metin);
    imagepng($resim_yaz);
    imagedestroy($resim_yaz);

// Session değerlerini atıyoruz.
    $_SESSION['guvenlik_kodu'] = "$metin";
    session_register("guvenlik_kodu");

?>

Yukarıdaki kodumuzu “capthca.php” olarak kaydedelim. Kodu test etmek için aşağıdaki gibi bir form.php oluşturabiliriz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
session_start();

if(isset($_POST['kod'])) {

 if($_POST['kod'] != $_SESSION['guvenlik_kodu']) {
 echo '<font face="Tahoma" size="1" color="#FF000">
 Güvenlik kodu hatalı! </font><br>'
;
 // Yapılacak işlemler...
 // die();
 }

 else {
 echo '<font face="Tahoma" size="1" color="#2DA322">
 Güvenlik kodu doğru! </font><br>'
;
 // Yapılacak işlemler...
 }

}

echo '
<form action="" method="POST">
<img src="capthca.php" style="border: 1px solid #525252"><br>
<input type="text" name="kod" size="8" style="border: 1px solid #525252">
<input type="submit" value="Test" style="border: 1px solid #525252">
<br>
<font face="Tahoma" size="1">
Büyük-Küçük harfe duyarlıdır. </font>
</form> '
;

?>

Scriptin çalışan örneği aşağıdaki gibi:

Script içeriğini ve font dosyasını paket halinde buradan indirebilirsiniz.

İlginizi Çekebilecek Diğer İçerikler

Facebook Yorumları

14 Yorum

    • timur

      aradan yıllar geçmiş ama genede yazayım kodda hatalar var bu kod resim basmaz. Kod hatalarını düzeltip local hostta denedim çalışıyor ama hatalı kodları düzeltmeniz gerek.

  1. Caner
    Yazar

    Localhosttaki bazı ayarlarınız resmin oluşturulmasına izin vermiyor olabilir, bir de web sunucusu üzerinde deneyin bakalım sorun devam edecek mi.

  2. metin

    haklısınız serverde deneyince oldu..ben Easyphp kullanıyorum..bir çok uygulamayı localhostta rahat deniyorum..bunun için ne önerirsiniz..

  3. citizen

    üye olma kısmında kaydola basınca captcha yı kontrol etmeden kaydoluyor. ama formları ayrı ayrı yapınca kontrol ediyor fakat bu seferde captcha nın bir anlamı kalmıyor.

  4. Ahmet

    Merhaba capthca.php da hata var sanırım resim basmıyor.
    bide ayrı bir konu hakkında yardımcı olabilirmisiniz. kullandığım form içinde çalıştıramadım bir türlü

  5. yunus ç

    çalışma bakımından gayet iyi fakat chromdan yada herhangi bir tarayıcıdan hata konsoluna bakarsanız sürekli
    Failed to load resource: the server responded with a status of 500 (Internal Server Error)
    hatası görürsünüz

Uyarı: Yorumlarda link kullanmayınız. Link içeren yorumlar otomatik olarak spam kabul edilmektedir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir