🔴 Red vs Blue #2: SQL Injection (SQLi) vs Prepared Statements & WAF Zırhı Web uygulamalarında tek bir tırnak işareti (') ciddi bir güvenlik açığının habercisi olabilir mi? Evet, kullanıcı girdilerinin SQL kodundan güvenli biçimde ayrılmadan dinamik sorgulara dahil edildiği sistemlerde SQL Injection açığı ortaya çıkabilir. 🔴 Kırmızı Takım (Red Team): SQL Injection (SQLi) Saldırısı Saldırgan, uygulamanın girdi alanlarını (login formu, arama çubuğu, URL parametreleri) manipüle ederek veritabanı motoruna kendi SQL komutlarını kabul ettirir. Adım 1: Girdi alanına mantıksal doğruluk sağlayan tırnak ve SQL karakterleri enjekte edilir (admin' OR '1'='1). Adım 2: Veritabanı motoru sorguyu WHERE username = 'admin' OR '1'='1' olarak yorumlar. Güvensiz oluşturulan sorgunun mantığı saldırgan tarafından değiştirilebilir ve bazı senaryolarda kimlik doğrulama kontrolü etkisiz hâle getirilebilir. Adım 3: SQLMap gibi otomatik araçlar veya UNION SELECT mantığı kullanılarak veritabanı şeması çıkartılır, tüm hassas veriler dışarı sızdırılır (Data Exfiltration). 🔵 Mavi Takım (Blue Team): Parametrik Sorgular ve WAF Koruması Saldırganın kod çalıştırmasını engellemek için savunma hattı sadece filtrelemeye değil, uygulamanın mimari yapısına dayanmalıdır. Parametrik Sorgular (Prepared Statements): Girdi ile SQL kodunu birbirinden tamamen ayırır. Kullanıcı ne yazarsa yazsın veritabanı bunu komut olarak değil, sadece zararsız bir veri (string) olarak işler. Web Application Firewall (WAF): Şüpheli SQL Injection kalıplarını ve anormal HTTP isteklerini tespit ederek ek bir savunma katmanı oluşturur. Ancak WAF, Prepared Statements'ın alternatifi değildir; asıl koruma güvenli kodlama ve parametrik sorgulardır. En Az Yetki İlkesi (Least Privilege): Web uygulamasının kullandığı veritabanı hesabına sistem yöneticisi (DBA/sa) yetkisi verilmez; sadece gerekli tablolar için okuma/yazma izni tanımlanır. ---- Güvenli Kod Örneği (Prepared Statement): PHP // GÜVENLİ: Parametrik sorgu + güvenli parola doğrulama $stmt = $pdo->prepare( 'SELECT id, username, password_hash FROM users WHERE username = :user' ); $stmt->execute(['user' => $userInput]); $user = $stmt->fetch(); if ($user && password_verify($passInput, $user['password_hash'])) { // Giriş başarılı } ---- Özet Karşılaştırma Red Team Amacı: SQL sorgu mantığını bozarak kimlik doğrulamasını geçmek ve veritabanını boşaltmak. Zayıflık: Dinamik string birleştirme ("SELECT * FROM... " + input) ile güvensiz sorgu oluşturulması. Blue Team Çözümü: Prepared Statements + WAF imzaları + Veritabanı yetki kısıtlaması. O zaman Mustafa soruyor: Projelerinizde veya incelediğiniz sistemlerde hâlâ string birleştirme ile yazılmış SQL sorgularına denk geliyor musunuz, yoksa ORM ve parametrik sorgu zırhı ekibinizde standart mı? Düşüncelerinizi yorumlarda paylaşın! 👇 Okuduğunuz için teşekkürler. Sonraki yazıma dek kendinize iyi bakın :)