11 Haziran 2015 Perşembe

PHP ile Kendi CAPTCHA'nızı Oluşturma

Merhaba Webkolog takipçileri!

Bugün sizlere web sitelerimizin vazgeçilmez güvenlik önlemlerinden biri olan CAPTCHA'ları PHP kullanarak nasıl kendi ellerimizle oluşturabileceğimizi anlatacağım. Özellikle form gönderimlerinde, yorum bölümlerinde veya üyelik kayıtlarında otomatik bot saldırılarını engellemek için CAPTCHA'lar oldukça etkili bir yöntemdir. Bugün, 11 Haziran 2015 tarihi itibarıyla güncel PHP sürümleriyle (PHP 5.x) uyumlu, pratik bir CAPTCHA oluşturma örneğini sizlerle paylaşacağım.

CAPTCHA Nedir ve Neden Kullanmalıyız?

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart), adından da anlaşılacağı gibi, bir bilgisayarın ve insanın birbirinden ayırt edilmesini sağlayan bir testtir. Temel amacı, web sitelerimizdeki formları otomatik botların spam göndermesini veya kötüye kullanmasını engellemektir. Genellikle deforme edilmiş harf ve rakamları bir görsel üzerinde göstererek, kullanıcının bu karakterleri doğru girmesini bekleriz. Bir insan için nispeten kolay olan bu işlem, botlar için oldukça zordur.


CAPTCHA Oluşturma Süreci

Kendi CAPTCHA'mızı oluşturmak için PHP'nin GD kütüphanesini kullanacağız. Bu kütüphane, görsel işleme yetenekleri sunar ve bize resimler üzerinde çizim yapma, metin ekleme gibi imkanlar tanır. Çoğu web sunucusunda GD kütüphanesi varsayılan olarak etkin gelir, ancak emin değilseniz phpinfo() çıktınızda GD desteğini kontrol edebilirsiniz.

İşlemi iki ana kısımda ele alacağız: CAPTCHA görselini oluşturan PHP dosyası ve bu görseli HTML formunda kullanan dosya.

1. CAPTCHA Görselini Oluşturan Dosya (captcha.php)

Öncelikle, CAPTCHA görselini oluşturacak ve bunu doğrudan tarayıcıya bir resim olarak sunacak bir PHP dosyası (örneğin captcha.php) oluşturalım. Bu dosya, bir oturum başlatacak, rastgele bir metin oluşturacak, bu metni bir resme yazacak ve resmi tarayıcıya gönderecektir.


<?php
session_start(); // Oturum başlatma

// Görselin genişliği ve yüksekliği
$width = 140;
$height = 70;

// Yeni bir boş görsel oluştur
$im = imageCreate($width, $height);

// Arkaplan rengi (siyah)
$bg = imageColorAllocate($im, 0, 0, 0); // RGB: 0,0,0 (siyah)

// Rastgele bir karakter dizisi oluştur
$len = 5; // CAPTCHA metninin uzunluğu
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // Kullanılacak karakterler
$string = '';
for ($i = 0; $i < $len; $i++) {
    $pos = rand(0, strlen($chars) - 1); // Karakterler arasından rastgele bir pozisyon seç
    $string .= $chars{$pos}; // Seçilen karakteri string'e ekle
}

// Oluşturulan metnin MD5 hash'ini oturum değişkenine kaydet
// Bu sayede, kullanıcının girdiği metinle karşılaştırmak için kullanacağız
$_SESSION['captcha_code'] = md5($string);

// Izgara çizgileri oluşturma (CAPTCHA'yı okunaksızlaştırmak için)
$grid_color = imageColorAllocate($im, 175, 0, 0); // Izgara rengi (koyu kırmızı)
$number_to_loop_x = ceil($width / 20); // Dikey çizgilerin sayısı
for($i = 0; $i < $number_to_loop_x; $i++) {
    $x = ($i + 1) * 20;
    imageLine($im, $x, 0, $x, $height, $grid_color); // Dikey çizgi çiz
}
$number_to_loop_y = ceil($height / 10); // Yatay çizgilerin sayısı
for($i = 0; $i < $number_to_loop_y; $i++) {
    $y = ($i + 1) * 10;
    imageLine($im, 0, $y, $width, $y, $grid_color); // Yatay çizgi çiz
}

// Rastgele çizgiler çizme (okunurluğu daha da azaltmak için)
$line_color = imageColorAllocate($im, 130, 0, 0); // Çizgi rengi
for($i = 0; $i < 30; $i++) { // 30 adet rastgele çizgi
    $rand_x_1 = rand(0, $width - 1);
    $rand_x_2 = rand(0, $width - 1);
    $rand_y_1 = rand(0, $height - 1);
    $rand_y_2 = rand(0, $height - 1);
    imageLine($im, $rand_x_1, $rand_y_1, $rand_x_2, $rand_y_2, $line_color);
}

// Metni görsele yazma
$text_color = imageColorAllocate($im, 255, 0, 0); // Metin rengi (parlak kırmızı)
// Metnin rastgele konumu
$rand_x = rand(0, $width - 50); 
$rand_y = rand(0, $height - 15); 
// Metni görsele yazdır (font boyutu 10, basit string fontu)
imageString($im, 10, $rand_x, $rand_y, $string, $text_color);

// Header'ı resim çıktısı olarak ayarla
header ("Content-type: image/png");
// Görseli PNG formatında tarayıcıya gönder
imagePNG($im);
// Bellekteki görseli temizle
imageDestroy($im);
?>
2. HTML Formunda CAPTCHA Kullanımı (form.php)

Şimdi de bu CAPTCHA görselini HTML formumuzda nasıl kullanacağımızı ve kullanıcının girdiği değeri nasıl doğrulayacağımızı gösteren bir dosya (örneğin form.php) oluşturalım:


<?php
session_start(); // Oturumu başlat, captcha.php ile aynı oturumu kullanabilmek için

$mesaj = "";

// Form gönderildiyse
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $girilen_captcha = isset($_POST['captcha']) ? $_POST['captcha'] : '';

    // Kullanıcının girdiği CAPTCHA ile oturumdaki değeri karşılaştır
    // Karşılaştırma yaparken MD5 hash'ini kullanıyoruz
    if (md5(strtoupper($girilen_captcha)) == $_SESSION['captcha_code']) { // Kullanıcının girdiği değeri de büyük harfe çevir
        $mesaj = "<p style='color: green;'>CAPTCHA doğru! İşlem başarılı.</p>";
        // Başarılı işlem sonrası oturumdaki CAPTCHA kodunu temizle
        unset($_SESSION['captcha_code']); 
    } else {
        $mesaj = "<p style='color: red;'>CAPTCHA yanlış! Lütfen tekrar deneyin.</p>";
    }
}
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CAPTCHA Testi</title>
    <style>
        body { font-family: Arial, sans-serif; }
        .captcha-container { margin-bottom: 15px; }
        .captcha-container img { border: 1px solid #ccc; vertical-align: middle; }
        .captcha-container input { padding: 8px; font-size: 16px; width: 100px; }
        button { padding: 10px 20px; font-size: 16px; cursor: pointer; }
        form { border: 1px solid #eee; padding: 20px; max-width: 400px; margin: 20px auto; }
        p { margin-top: 10px; font-weight: bold; }
    </style>
</head>
<body>
    <h4>CAPTCHA Doğrulama Formu</h4>
    <form action="" method="post">
        <div class="captcha-container">
            <label for="captcha">Lütfen aşağıdaki kodu giriniz:</label><br>
            <img src="captcha.php" alt="CAPTCHA Kodu"> 
            <input type="text" id="captcha" name="captcha" required>
        </div>
        <button type="submit">Gönder</button>
        <?php echo $mesaj; ?>
    </form>
</body>
</html>

Burada dikkat etmeniz gereken en önemli nokta, <img src="captcha.php"> satırıdır. Bu, tarayıcınızın captcha.php dosyasını bir resim olarak çalıştırmasını ve çıktısını burada göstermesini sağlar.

Kullanıcı formu gönderdiğinde, form.php dosyası yeniden çalışır. $_POST['captcha'] ile kullanıcının girdiği değeri alırız. Bu değeri md5() fonksiyonu ve strtoupper() ile büyük harfe çevirip oturumda sakladığımız hash değeriyle karşılaştırırız. Eğer eşleşirse, CAPTCHA doğru demektir. Karşılaştırma yaparken hem oluşturulan metni hem de kullanıcının girdiği metni büyük harfe çevirmek, büyük/küçük harf duyarlılığı sorununu ortadan kaldırır.

Kendi CAPTCHA'nızı oluşturmak, siteniz için ekstra bir güvenlik katmanı sağlar. Unutmayın ki, daha karmaşık botları engellemek için CAPTCHA'nızın görsel karmaşıklığını artırabilir, farklı fontlar veya görsel efektler kullanabilirsiniz. Ayrıca, başarılı doğrulamanın ardından oturumdaki CAPTCHA kodunu temizlemeyi unutmayın ki aynı kod tekrar kullanılmasın.

Umarım bu makale, PHP ile kendi CAPTCHA'larınızı oluşturma konusunda size yol göstermiştir. Web güvenliği her zaman önceliğimiz olmalı!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve keyifli öğrenme süreçleri dilerim!

0 yorum:

Yorum Gönder