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ı

15 Yorum

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