Php İle Web Sitesi İçin Dinamik Güvenlik Duvarı Yönetimi Nasıl Yapılır?

Php İle Web Sitesi İçin Dinamik Güvenlik Duvarı Yönetimi Nasıl Yapılır?
Php İle Web Sitesi İçin Dinamik Güvenlik Duvarı Yönetimi Nasıl Yapılır?

PHP ile Web Sitesi İçin Dinamik Güvenlik Duvarı Yönetimi Nasıl Yapılır?

Web sitenize gelen trafiği kontrol altında tutmak, modern dijital dünyada güvenliğin temel taşıdır. PHP ile web sitesi için dinamik güvenlik duvarı yönetimi yaparak, kötü niyetli botları, saldırgan IP adreslerini veya şüpheli istekleri uygulama seviyesinde engelleyebilirsiniz. Bu rehberde, bir sunucu veya WAF (Web Application Firewall) hizmetine ihtiyaç duymadan, PHP'nin yerel yeteneklerini kullanarak nasıl akıllı bir filtreleme mekanizması kuracağınızı öğreneceksiniz.

Bu eğitim, PHP 8.x ve üzeri sürümlerle uyumlu, performans odaklı ve ölçeklenebilir bir yapı kurmayı hedefler. Backend geliştiricileri için hazırlanan bu içerikte, veritabanı destekli bir engelleme listesi ve istek kısıtlama (rate limiting) mantığını adım adım inşa edeceğiz.

Ön Hazırlık ve Gereksinimler

Dinamik bir güvenlik duvarı oluşturmak için sunucunuzda bazı temel bileşenlerin kurulu olması gerekir. PHP'nin 8.2 veya daha yeni bir sürümünü kullanmanız, hem performans hem de güvenlik güncellemeleri açısından kritik öneme sahiptir.

  • PHP 8.2+: Daha hızlı ve güvenli tip belirleme özellikleri için.
  • PDO (PHP Data Objects): Veritabanı işlemleri için güvenli bir arayüz.
  • Redis veya MySQL: Engellenen IP adreslerini ve istek sayaçlarını saklamak için.
  • Web Sunucusu: Apache veya Nginx üzerinde PHP'nin doğru yapılandırılmış olması.

Ayrıca, sunucunuzun $_SERVER['REMOTE_ADDR'] gibi değişkenleri doğru okuyabildiğinden emin olmalısınız. Eğer bir Cloudflare veya yük dengeleyici (load balancer) arkasındaysanız, gerçek IP adresini almak için HTTP_CF_CONNECTING_IP gibi header bilgilerini kontrol etmeniz gerekecektir.

Adım 1: IP Adresi ve İstek Verilerinin Toplanması

Güvenlik duvarının ilk adımı, gelen isteği tanımlamaktır. Kullanıcının IP adresini ve istek attığı URL bilgisini doğru bir şekilde almalıyız. Aşağıdaki kod bloğu, güvenli bir şekilde IP adresi tespiti yapmanızı sağlar.

function getClientIp(): string {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    return $_SERVER['REMOTE_ADDR'];
}

$ipAddress = getClientIp();
$requestUri = $_SERVER['REQUEST_URI'];

Bu fonksiyon, proxy arkasındaki kullanıcıların gerçek IP adreslerini yakalamak için tasarlanmıştır. Ancak, HTTP_X_FORWARDED_FOR başlığı manipüle edilebilir; bu nedenle bu değeri kullanırken mutlaka bir doğrulama (validation) katmanından geçirmelisiniz.

Adım 2: Veritabanı Yapılandırması ve Engelleme Listesi

Dinamik bir güvenlik duvarı, statik bir dosya yerine veritabanı kullanmalıdır. Bu sayede yönetici panelinden anlık olarak IP engelleyebilir veya engeli kaldırabilirsiniz. Aşağıdaki tablo yapısı, basit bir engelleme sistemi için yeterlidir.

Sütun Tip Açıklama
id INT Birincil anahtar
ip_address VARCHAR(45) Engellenen IP adresi (IPv6 uyumlu)
reason TEXT Engelleme sebebi
expires_at DATETIME Engelin kalkacağı tarih

Veritabanı bağlantınızı PDO ile kurarak SQL Injection saldırılarına karşı hazırlıklı olmalısınız. İşte bir IP adresinin veritabanında engelli olup olmadığını kontrol eden örnek kod:

function isBlocked(PDO $pdo, string $ip): bool {
    $stmt = $pdo->prepare("SELECT id FROM firewall_bans WHERE ip_address = :ip AND expires_at > NOW()");
    $stmt->execute(['ip' => $ip]);
    return (bool) $stmt->fetch();
}

Adım 3: İstek Sınırlandırma (Rate Limiting) Mantığı

Sadece belirli IP'leri engellemek yetmez; aynı zamanda bir IP'nin çok kısa sürede çok fazla istek atmasını da engellemelisiniz. Bu, "Brute Force" saldırılarını önlemek için hayati önem taşır. Redis, bu işlem için en ideal araçtır.

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = "rate_limit:" . $ipAddress;
$currentRequests = $redis->incr($key);

if ($currentRequests === 1) {
    $redis->expire($key, 60); // 60 saniye içinde sınırla
}

if ($currentRequests > 100) {
    die("Çok fazla istek. Lütfen bekleyin.");
}

Yukarıdaki kod, bir IP adresinin 60 saniye içerisinde 100'den fazla istek atmasını engeller. Bu yöntem, sunucu kaynaklarınızı korumak için oldukça etkilidir.

Adım 4: Güvenlik Duvarı Motorunu Entegre Etme

Tüm bu parçaları birleştiren bir Firewall sınıfı oluşturmak, kodunuzun sürdürülebilirliğini artırır. Bu sınıfı, uygulamanızın en tepesinde (örneğin index.php veya bir bootstrap.php dosyası) çağırmalısınız.

class Firewall {
    public static function run(PDO $pdo) {
        $ip = getClientIp();
        if (isBlocked($pdo, $ip)) {
            http_response_code(403);
            exit("Erişim engellendi.");
        }
    }
}

// Uygulama başlangıcında çalıştır
Firewall::run($pdo);

Bu yapı, uygulamanızın veritabanı bağlantısı kurulur kurulmaz güvenlik kontrollerini yapmasını sağlar. Eğer IP engelli ise, kodun devamı işlenmeden süreç sonlandırılır.

Kritik Güvenlik Uyarısı: Güvenlik duvarı kodlarını her zaman uygulamanızın en üst seviyesinde çalıştırın. Veritabanı bağlantısı kurmadan önce basit bir "beyaz liste" veya "kara liste" kontrolü yapmak, veritabanı yükünü azaltacaktır.

Adım 5: Gelişmiş Filtreleme ve Günlükleme (Logging)

Güvenlik duvarınızın ne kadar etkili olduğunu anlamak için günlük tutmalısınız. Engellenen her isteği bir log dosyasına veya veritabanına yazarak saldırı modellerini analiz edebilirsiniz.

function logAttack(string $ip, string $reason) {
    $logEntry = sprintf("[%s] Saldırı Girişimi: %s - Sebep: %s\n", date('Y-m-d H:i:s'), $ip, $reason);
    file_put_contents('firewall_logs.txt', $logEntry, FILE_APPEND);
}

Log dosyalarınızı düzenli olarak incelemek, sitenize yönelik spesifik saldırı türlerini (örneğin, belirli bir formdaki XSS denemeleri) tespit etmenize yardımcı olur.

Sıkça Sorulan Sorular

Dinamik güvenlik duvarı performansı etkiler mi?

Evet, her istekte veritabanı sorgusu yapmak performansı bir miktar düşürebilir. Bunu önlemek için Redis gibi "in-memory" (bellek içi) veritabanlarını kullanmanızı öneririm.

IPv6 adresleri ile nasıl çalışırım?

Veritabanınızdaki IP sütununu VARCHAR(45) yaparak IPv6 adreslerini sorunsuz bir şekilde saklayabilirsiniz. PHP'nin filter_var($ip, FILTER_VALIDATE_IP) fonksiyonu hem IPv4 hem de IPv6 için uygundur.

Beyaz liste (Whitelist) nasıl eklerim?

Engelleme kontrolünden önce, güvendiğiniz IP adreslerini içeren bir dizi (array) veya veritabanı tablosu ile kontrol yapıp, eşleşme durumunda fonksiyonu erken sonlandırarak beyaz liste oluşturabilirsiniz.

Cloudflare kullanıyorsam ne yapmalıyım?

Cloudflare'in sağladığı CF-Connecting-IP header değerini mutlaka kontrol etmeli ve sunucunuzu sadece Cloudflare IP'lerinden gelen isteklere izin verecek şekilde yapılandırmalısınız.

Bu sistem XSS saldırılarını önler mi?

Bu sistem bir "WAF" mantığıyla çalışır; ancak XSS için asıl çözüm, verileri çıktıya basarken htmlspecialchars() gibi fonksiyonlarla temizlemektir. Güvenlik duvarı sadece giriş kapısını korur.

Güvenlik Duvarı Sisteminde Hata Ayıklama ve İzleme (Monitoring)

Dinamik bir güvenlik duvarı sistemi kurduğunuzda, sistemin meşru kullanıcıları yanlışlıkla engellemediğinden emin olmak kritik bir süreçtir. "False Positive" (yanlış pozitif) durumlarını tespit etmek için kapsamlı bir izleme mekanizmasına ihtiyacınız vardır.

Hata Günlüklerini Analiz Etme

Sisteminiz tarafından engellenen her istek için veritabanına sadece IP adresini değil, aynı zamanda isteğin yapıldığı URL'yi, HTTP metodunu ve kullanılan User-Agent bilgisini de kaydetmelisiniz. Bu veriler, sistemin neden bir kullanıcıyı engellediğini anlamanıza yardımcı olur.

// Engellenen istekleri loglayan örnek fonksiyon
function logBlockedRequest($ip, $reason) {
    $logEntry = sprintf(
        "[%s] IP: %s | Sebep: %s | URL: %s\n",
        date('Y-m-d H:i:s'),
        $ip,
        $reason,
        $_SERVER['REQUEST_URI']
    );
    file_put_contents(__DIR__ . '/logs/blocked.log', $logEntry, FILE_APPEND);
}

Test Senaryoları ve Stres Testi

Sisteminizi canlıya almadan önce, yerel ortamınızda simüle edilmiş saldırılarla test etmelisiniz. Özellikle curl aracı ile kısa sürede binlerce istek göndererek rate limiting mekanizmanızın tetiklenip tetiklenmediğini gözlemleyin.

# Terminal üzerinden 10 saniyede 50 istek göndererek sistemi test edin
for i in {1..50}; do curl -I http://localhost/index.php; done

Sistem Performansını Optimize Etme

Güvenlik duvarı her istekte çalıştığı için, veritabanı sorgularınızın hızı web sitenizin toplam yanıt süresini doğrudan etkiler. Veritabanı yerine bellek tabanlı depolama çözümleri kullanmak, milisaniyeler düzeyinde performans artışı sağlar.

Redis Kullanarak Hızlandırma

Veritabanı sorguları yerine Redis gibi bir anahtar-değer deposu kullanmak, rate limiting süreçlerini neredeyse sıfır gecikme ile çalıştırmanıza olanak tanır. İşte Redis ile basit bir sayaç mantığı:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = "rate_limit:" . $_SERVER['REMOTE_ADDR'];
$currentRequests = $redis->incr($key);

if ($currentRequests === 1) {
    $redis->expire($key, 60); // 60 saniyelik pencere
}

if ($currentRequests > 100) {
    die("Çok fazla istek gönderdiniz. Lütfen bekleyin.");
}

Önbellekleme Stratejileri

Eğer veritabanı kullanmaya devam edecekseniz, engellenen IP listesini her istekte sorgulamak yerine, bu listeyi bir dizi (array) olarak PHP'nin APCu önbelleğinde tutun. Bu sayede disk veya veritabanı I/O yükünü tamamen ortadan kaldırmış olursunuz.

  • APCu Kullanımı: Sık sorgulanan engelli listesini belleğe yükleyin.
  • Sorgu Optimizasyonu: Veritabanı tablonuzda IP sütununa mutlaka INDEX ekleyin.
  • Asenkron Loglama: Log yazma işlemlerini ana akıştan ayırarak (örneğin kuyruk sistemleri ile) yanıt süresini kısaltın.

Sonuç

PHP ile kendi dinamik güvenlik duvarınızı yönetmek, sitenizin savunma hattını güçlendirmenin etkili bir yoludur. Bu rehberde öğrendiğiniz IP filtreleme, rate limiting ve loglama teknikleri, uygulamanızı temel saldırılara karşı korumak için sağlam bir temel oluşturur. Bir sonraki adım olarak, bu sistemi Laravel veya Symfony gibi framework'lerin "Middleware" yapılarına entegre ederek daha modüler hale getirebilirsiniz.

Sorumluluk Reddi: Bu rehberdeki kodlar eğitim amaçlıdır. Web güvenliği karmaşık bir süreçtir; profesyonel projelerde bu yöntemlerin yanı sıra sunucu seviyesinde (ModSecurity, Fail2Ban) korumalar ve profesyonel WAF hizmetleri kullanılması şiddetle önerilir.
Bu yazıya tepkinizi paylaşın:
Kerem Demir

Dijital araçlar ve kişisel verimlilik üzerine uzmanlaşmış profesyonel bir yazarım. Karmaşık konuları basit ve anlaşılır kılmak için rehber odaklı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz