🐹 Mustafa ile Öğreniyorum #20: SQL Injection (SQLi) ve Veritabanı Savunma Zırhı Web uygulamalarında onlarca yıldır var olmasına rağmen hâlâ OWASP Top 10 listesinin üst sıralarında yer alan ve veritabanı sunucularını tehdit eden en kritik zafiyetlerden birini inceliyoruz: SQL Injection (SQLi). 📌 SQL Injection (SQLi) Nedir? Kullanıcıdan alınan verilerin (form girdileri, URL parametreleri, çerezler vb.) filtrelemeden geçirilmeden doğrudan SQL sorgusuna dahil edilmesi sonucu ortaya çıkar. Saldırganlar, sorgunun mantıksal yapısını bozarak yetkisiz veri okuma, veritabanı kayıtlarını silme/değiştirme hatta sunucu seviyesinde komut koşturma (RCE) yetkisi elde edebilir. 🔍 Temel SQLi Türleri In-Band SQLi (Klasik): Saldırganın girdi gönderdiği kanaldan doğrudan veriyi veya hatayı görebildiği yöntemdir (ör. Error-based, UNION-based). Inferential SQLi (Blind / Kör): Ekranda doğrudan veri basılmaz. Saldırgan, uygulamanın verdiği doğru/yanlış yanıtlarına (Boolean-based) veya veritabanının yanıt verme süresine (Time-based) bakarak veriyi karakter karakter çeker. Out-of-Band SQLi: Veritabanı sunucusunun DNS veya HTTP istekleri yaparak veriyi farklı bir kanaldan saldırganın sunucusuna iletmesidir. 🛡 SQL Injection'dan Korunma Yolları ve Alınacak Önlemler Parametreli Sorgular (Prepared Statements): En temel ve %100 etkili savunma hattıdır. Kullanıcı girdisi veritabanına kod olarak değil, kesin olarak veri (literal) olarak iletilir. ORM (Object-Relational Mapping) Kullanımı: Entity Framework, Hibernate veya Prisma gibi ORM araçları varsayılan olarak parametreli sorgu yapısı kullanarak SQLi riskini minimize eder. En Az Yetki İlkesi (Least Privilege): Web uygulamasının veritabanı bağlantı hesabı asla sa veya root gibi tam yetkili kullanıcı olmamalıdır. Sadece gerekli tablolara okuma/yazma izni tanımlanmalıdır. Girdi Doğrulama (Validation & Whitelisting): Beklenen veri tipi tamsayı (INTEGER) ise metinsel ifadeler uygulama seviyesinde derhal reddedilmelidir. WAF (Web Application Firewall): Katmanlı güvenlik için bilinen SQLi kalıplarını uygulama seviyesine ulaşmadan engeller. 💻 Hatalı ve Güvenli Kod Örneği // ❌ ZAYIF KOD (String Birlestirme - SQLi'ye Acik) $query = "SELECT * FROM users WHERE username = '" . $_POST['user'] . "' AND password = '" . $_POST['pass'] . "'"; // ✅ GÜVENLİ KOD (Prepared Statements / Parametreli Sorgu) $stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE username = :username'); $stmt->execute(['username' => $_POST['user']]); O zaman Mustafa soruyor: Projelerinizde veya güvenlik testlerinizde SQLi zafiyetini engellemek için Prepared Statements / ORM yapısı kullanıyor musunuz? Sizce sadece WAF arkasına sığınmak veritabanı güvenliği için yeterli bir çözüm mü? Düşüncelerinizi yorumlarda paylaşın! 👇 Okuduğunuz için teşekkürler! Kendinize, verilerinize ve dijital zırhınıza çok iyi bakın! 🌼