Ön Hazırlık ve Gereksinimler
Kendi güvenlik duvarınızı oluşturmadan önce, sunucu ortamınızın ve WordPress kurulumunuzun bu sürece hazır olduğundan emin olmalısınız. Dinamik bir güvenlik duvarı, PHP'nin erken evrelerinde çalışacağı için hata yapılması durumunda sitenize erişimi tamamen engelleyebilir.
- PHP 8.2 veya üzeri bir sürüm (Performans ve güvenlik güncellemeleri için).
- WordPress 6.5+ sürümü.
- Sunucu erişimi (FTP veya SSH üzerinden dosya düzenleme yetkisi).
- Temel düzeyde PHP ve WordPress kanca (hook) yapısı bilgisi.
Uyarı: Kodları canlı sitenizde uygulamadan önce mutlaka yerel bir ortamda veya bir staging (test) sunucusunda deneyin. Hatalı bir mantık, sitenizi "White Screen of Death" (Beyaz Ekran Hatası) ile karşı karşıya bırakabilir.
Adım 1: İstekleri Yakalamak İçin Erken Erişim Noktası
WordPress'in wp-config.php dosyası, sistemin en erken yüklenen dosyalarından biridir. Güvenlik duvarımızı burada tetiklemek, kötü niyetli isteklerin veritabanına ulaşmasını engellemek için en verimli yöntemdir.
// wp-config.php dosyasının en üstüne ekleyin
if (file_exists(dirname(__FILE__) . '/custom-firewall.php')) {
require_once(dirname(__FILE__) . '/custom-firewall.php');
}
Bu kod bloğu, ana dizinde oluşturacağımız custom-firewall.php dosyasını sisteme dahil eder. Böylece WordPress'in geri kalanı yüklenmeden önce güvenlik kontrollerimiz devreye girer.
Adım 2: Temel Güvenlik Mantığı ve IP Filtreleme
Şimdi custom-firewall.php dosyamızı oluşturalım. İlk adım olarak, kara listeye alınmış IP adreslerini kontrol eden bir yapı kuralım. Bu, kaba kuvvet (brute-force) saldırılarını durdurmak için ilk savunma hattıdır.
Adım 3: SQL Enjeksiyonu ve XSS Saldırılarına Karşı Payload Filtreleme
IP filtreleme tek başına yeterli değildir; çünkü saldırganlar genellikle dinamik IP adresleri veya proxy sunucuları üzerinden gelirler. Bu noktada, gelen isteklerin (GET ve POST parametreleri) içeriğini analiz eden bir "payload" filtresi oluşturmamız gerekir. Bu filtre, yaygın SQL enjeksiyonu ve XSS (Cross-Site Scripting) kalıplarını tespit eder.
Aşağıdaki kod bloğunu custom-firewall.php dosyanızın içine, IP kontrolünden hemen sonra ekleyin:
function sanitize_request_data($data) {
$patterns = [
'/(union|select|insert|update|delete|drop|truncate|alter|create|replace)/i',
'/.*?/i',
'/javascript:/i',
'/base64_decode/i'
];
if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = sanitize_request_data($value);
}
} else {
foreach ($patterns as $pattern) {
if (preg_match($pattern, $data)) {
die('Güvenlik İhlali: Kötü niyetli istek tespit edildi.');
}
}
}
return $data;
}
// GET ve POST verilerini temizle
sanitize_request_data($_GET);
sanitize_request_data($_POST);
Bu fonksiyon, gelen her veriyi bir dizi düzenli ifade (regex) ile karşılaştırır. Eğer bir eşleşme bulunursa, die() fonksiyonu ile işlemin devam etmesini engeller. Bu, veritabanına ulaşmadan önce zararlı komutları durdurmak için kritik bir katmandır.
Adım 4: Performans Optimizasyonu ve Loglama
Güvenlik duvarı sistemleri, her istekte çalıştığı için sitenizin hızını etkileyebilir. Bu nedenle, filtreleme işlemlerini optimize etmek ve gerçekleşen engellemeleri izlemek için bir loglama mekanizması kurmalıyız. Çok sayıda engellenen istek, sunucu kaynaklarını tüketebilir.
Aşağıdaki yapı, engellenen istekleri bir metin dosyasına yazarak saldırıları analiz etmenize olanak tanır:
function log_blocked_request($reason) {
$log_file = dirname(__FILE__) . '/firewall-logs.txt';
$timestamp = date('Y-m-d H:i:s');
$ip = $_SERVER['REMOTE_ADDR'];
$request_uri = $_SERVER['REQUEST_URI'];
$log_entry = "[$timestamp] IP: $ip | URI: $request_uri | Sebep: $reason" . PHP_EOL;
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
// Örnek kullanım:
// log_blocked_request('SQL Enjeksiyon denemesi');
Performans İpuçları:
- Önbellekleme: Eğer çok yüksek trafikli bir siteniz varsa, IP listesini her istekte dosyadan okumak yerine
wp_cache_set veya APCu gibi bellek içi önbellekleme yöntemlerini kullanın.
- Dosya İzinleri:
firewall-logs.txt dosyasının yazılabilir olduğundan ancak dışarıdan doğrudan erişilemediğinden emin olun.
- Dosya Boyutu: Log dosyanızın aşırı büyümesini engellemek için haftalık olarak temizleyen bir cron job (zamanlanmış görev) oluşturmayı unutmayın.
Bu sistem, WordPress çekirdeği yüklenmeden önce devreye girdiği için, veritabanı sorgularını tetikleyebilecek saldırıları henüz başlangıç aşamasında durdurarak sunucu yükünüzü ciddi oranda azaltır.


Yorumlar (0)
Yorum Yaz