Bir arama kutusuna birkaç özel karakter yazıyorsunuz — ve sitenin tüm veritabanı önünüze dökülüyor. Kulağa inanılmaz gelse de SQL injection, on yıllardır web güvenliğinin en yaygın ve en yıkıcı açıklarından biri olmayı sürdürüyor. OWASP'ın her yıl güncellediği "En Tehlikeli 10 Web Güvenlik Açığı" listesinde her zaman üst sıralarda yer alıyor.
SQL injection, bir saldırganın uygulama arayüzündeki giriş alanlarına zararlı SQL kodu ekleyerek arka plandaki veritabanı sorgularını manipüle ettiği bir saldırı türüdür. Uygulama bu girdiyi doğrulamadan doğrudan SQL sorgusuna dahil ederse saldırgan sorgunun akışını değiştirebilir.
Basit bir örnekle açıklamak gerekirse: bir giriş formu şu sorguyu çalıştırıyor olabilir — kullanıcı adını ve parolayı veritabanında eşleştir. Saldırgan kullanıcı adı alanına ' OR '1'='1 gibi bir ifade girdiğinde sorgunun mantığı bozulur ve sistem her zaman "doğru" döndürür. Parola girmeden sisteme girilmiş olur.
SQL injection'ın etkisi saldırganın hedefine ve uygulamanın mimarisine bağlı olarak değişir. En yaygın senaryolar şunlar:
In-band SQL injection en yaygın form. Saldırı ve veri çalma aynı kanal üzerinden gerçekleşir. Hata mesajları veya doğrudan dönen sonuçlar kullanılarak bilgi toplanır.
Blind SQL injection, uygulamanın doğrudan sonuç döndürmediği durumlarda kullanılır. Saldırgan evet/hayır sorularıyla veritabanını sistematik biçimde sorgular. Yavaş ama etkili.
Out-of-band SQL injection, veritabanının farklı bir kanal üzerinden (DNS, HTTP isteği) veri göndermesini sağlar. Nispeten nadirdir ama tespit edilmesi zordur.
Parametreli sorgular (Prepared Statements) en etkili ve en kesin çözüm. SQL sorgusu ile kullanıcı girdisi birbirinden ayrı tutulur; girdi hiçbir zaman sorgunun bir parçası olarak yorumlanmaz. PDO, MySQLi veya kullandığınız framework'ün ORM katmanı bu yapıyı destekliyor. Eğer tek bir güvenlik önlemi seçmeniz gerekiyorsa bu olsun.
ORM kullanımı, veritabanı sorgularını doğrudan yazmak yerine bir soyutlama katmanı üzerinden yönetir. Laravel Eloquent, Django ORM veya Hibernate gibi araçlar parametreli sorguları otomatik olarak uygular.
Girdi doğrulama ve temizleme, tüm kullanıcı girdilerinin beklenen formata uygun olup olmadığını kontrol eder. Bir telefon numarası alanı yalnızca rakam içermeli, bir isim alanı SQL anahtar kelimeleri barındırmamalı. Ancak bu önlem tek başına yeterli değil — parametreli sorgularla birlikte kullanılmalı.
En az ayrıcalık prensibi, veritabanı kullanıcısına yalnızca ihtiyaç duyduğu izinlerin verilmesini ifade eder. Web uygulamanızın kullandığı veritabanı hesabının DROP TABLE veya CREATE USER gibi yetkilerinin olmaması gerekir. Saldırı başarılı olsa bile yapılabilecek hasar sınırlanmış olur.
Web Application Firewall (WAF), bilinen SQL injection kalıplarını trafik düzeyinde tespit ederek engeller. Kod düzeyindeki güvenliğin tamamlayıcısıdır; tek başına yeterli değildir ama katmanlı savunmada değerli bir katman oluşturur.
WordPress, veritabanı sorgularını yönetmek için kendi wpdb sınıfını kullanıyor. Eklenti veya tema geliştiriyorsanız $wpdb->prepare() metodunu kullanmak, SQL injection'a karşı WordPress ekosistemindeki standart çözüm. Hazır eklentilerde bu güvenliği geliştirici sağlıyor — bu yüzden eklenti seçiminde aktif geliştirme ve iyi değerlendirme geçmişi kritik önem taşıyor.
Kendi sitenizin SQL injection açığı taşıyıp taşımadığını test etmek için OWASP ZAP veya SQLMap gibi araçlar kullanılabilir. Bu araçları yalnızca üzerinde izniniz olan sistemlerde çalıştırın — izinsiz test yasal sorumluluk doğurur. Profesyonel bir güvenlik testi için sızma testi (penetration testing) hizmeti almayı da değerlendirin.