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 veyaon
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.