İçeriği Atla

Php de genel ve basit bir güvenlik duvarı örneği

Php de genel ve basit bir güvenlik duvarı örneği

PHP'de bir güvenlik duvarı (Web Application Firewall - WAF) oluşturmak, bir dizi güvenlik önlemi alarak gelen ve giden HTTP isteklerini filtrelemek anlamına gelir. Bu süreç, potansiyel saldırıları engellemeyi ve kötü amaçlı etkinlikleri tespit etmeyi amaçlar. Bir WAF'yi sıfırdan yazmak karmaşık bir iş olabilir, ancak temel adımlarla PHP'de bir güvenlik duvarı oluşturmak mümkündür.

Aşağıda temel bir PHP WAF için izleyebileceğiniz adımlar ve örnek bir yapı vardır:

1. Temel Özellikler Belirleme

Bir WAF’in temel işlevleri aşağıdaki gibidir:

  • SQL enjeksiyonlarını engellemek
  • XSS saldırılarını tespit etmek ve önlemek
  • DDoS koruması sağlamak
  • Girdi doğrulama ve sanitize etme
  • IP kara listeleme ve beyaz listeleme

2. Temel İstek İnceleme Mantığı

Her gelen isteği inceleyen bir middleware mantığında çalışacak bir kod yazmanız gerekecek. Bunun için, her gelen isteği farklı saldırılara karşı kontrol eden bir yapı oluşturabilirsiniz.

<?php
class BasicWAF {


    // SQL enjeksiyonlarını tespit etmek için riskli kelimeler
    private $sql_keywords = ['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'DROP', 'UNION', '--', '#', '/*', '*/'];


    // XSS saldırılarını tespit etmek için riskli inputlar
    private $xss_patterns = [
        '/<script\b[^>]*>(.*?)<\/script>/is', // script tag
        '/on[a-z]+\s*=\s*["\'][^"\']*["\']/i', // inline event handlers (onmouseover, onload, vb.)
    ];


    // Riskli IP adreslerini kara listeye ekleyin
    private $blocked_ips = [
        '192.168.1.1',  // örnek IP
    ];


    // Geçerli oturum başlatılıyor.
    public function __construct() {
        session_start();
    }


    // İstekleri analiz etme fonksiyonu
    public function analyzeRequest() {
        $this->checkBlockedIPs();
        $this->checkSQLInjection();
        $this->checkXSS();
    }


    // Kara listeye alınmış IP'leri kontrol etme
    private function checkBlockedIPs() {
        $client_ip = $_SERVER['REMOTE_ADDR'];
        if (in_array($client_ip, $this->blocked_ips)) {
            die('Erişim engellendi: IP adresiniz kara listede.');
        }
    }


    // SQL enjeksiyonu kontrolü
    private function checkSQLInjection() {
        foreach ($_REQUEST as $key => $value) {
            foreach ($this->sql_keywords as $keyword) {
                if (stripos($value, $keyword) !== false) {
                    die('Güvenlik tehdidi tespit edildi: SQL Enjeksiyonu engellendi.');
                }
            }
        }
    }


    // XSS kontrolü
    private function checkXSS() {
        foreach ($_REQUEST as $key => $value) {
            foreach ($this->xss_patterns as $pattern) {
                if (preg_match($pattern, $value)) {
                    die('Güvenlik tehdidi tespit edildi: XSS saldırısı engellendi.');
                }
            }
        }
    }


    // IP adresini geçici olarak engellemek için oturum bazlı DDoS koruması
    public function protectAgainstDDoS($limit = 100) {
        if (!isset($_SESSION['request_count'])) {
            $_SESSION['request_count'] = 1;
            $_SESSION['start_time'] = time();
        } else {
            $_SESSION['request_count']++;


            // Saniye başına istek sınırını aşan durumları kontrol et
            $elapsed_time = time() - $_SESSION['start_time'];
            if ($_SESSION['request_count'] > $limit && $elapsed_time < 60) {
                die('DDoS saldırı tespit edildi. Lütfen tekrar deneyin.');
            }


            // Bir dakika dolduğunda sayaçları sıfırla
            if ($elapsed_time >= 60) {
                $_SESSION['request_count'] = 1;
                $_SESSION['start_time'] = time();
            }
        }
    }
}


// WAF örneği başlatılıyor
$waf = new BasicWAF();
$waf->analyzeRequest();
$waf->protectAgainstDDoS();

3. Temel Güvenlik Kontrolleri

  • SQL Enjeksiyonu Tespiti: $_REQUEST değişkeni üzerinden gelen verilerde SQL enjeksiyonu olasılığı taşıyan kelimeleri arıyor.
  • XSS Tespiti: Girdi değerlerinde XSS saldırılarına sebep olabilecek script tagleri veya on eventlerini kontrol ediyor.
  • IP Engelleme: İstenmeyen IP adresleri kara listeye alınıyor ve bu IP'ler erişimi reddediliyor.
  • DDoS Koruması: Oturum başına istek sayısını sınırlayarak basit bir DDoS saldırı tespiti yapılıyor.

4. Gelişmiş Özellikler Eklemek

Yukarıdaki temel yapıdan yola çıkarak aşağıdaki gelişmiş güvenlik önlemlerini ekleyebilirsiniz:

  • Girdi Sanitizasyonu: Kullanıcı girdilerini sadece denetlemek yerine, otomatik olarak temizleme işlemi yapabilirsiniz. Örneğin, htmlspecialchars() ile HTML özel karakterlerini temizlemek.
  • IP Kara/Beyaz Liste Yönetimi: Daha geniş bir kara ve beyaz listeleme stratejisi oluşturabilir ve bunları bir veritabanı ile yönetebilirsiniz.
  • Loglama: Güvenlik tehditleri tespit edildiğinde bunları bir log dosyasına yazmak, saldırıları analiz etmek için önemlidir.
  • Captcha: Form tabanlı saldırılara karşı CAPTCHA entegrasyonu yapılabilir.
  • Dosya Yüklemelerine Karşı Koruma: Yüklenen dosyaların içeriklerini ve mime tiplerini kontrol eden bir dosya güvenliği modülü ekleyebilirsiniz.

5. Sürekli Güncelleme ve Test

Web güvenliği dinamik bir alan olduğu için, düzenli olarak yeni güvenlik açıklarına karşı kodunuzu güncellemeniz gerekecek. OWASP'ın yayınladığı güvenlik rehberlerini takip ederek güvenlik stratejinizi güçlendirebilirsiniz.

Ek Kaynaklar:

  • OWASP Top 10: Web uygulamalarındaki yaygın güvenlik açıkları hakkında bilgi sahibi olmak için OWASP Top 10 listesini kullanabilirsiniz.
  • PHP Security Best Practices: PHP'de güvenlik önlemlerini artırmak için en iyi uygulamaları sürekli araştırmalı ve geliştirmelisiniz.

PHP'de güvenlik duvarı geliştirmek oldukça geniş kapsamlı olabilir. Yüksek seviyede güvenlik gereksinimlerine sahipseniz, daha geniş kapsamlı bir WAF çözümü kullanmayı veya güvenlik uzmanlarıyla çalışmayı da göz önünde bulundurmalısınız.