SQL Injection Nedir ve Nasıl Önlenir?
SQL Injection (SQLi), kötü niyetli kullanıcıların bir uygulamanın veri tabanına zararlı SQL komutları enjekte ederek yetkisiz veri erişimi sağlamasına, veri manipülasyonuna veya veri sızdırmasına neden olan ciddi bir güvenlik açığıdır. Bu tür saldırılar, dünya genelinde en yaygın ve en tehlikeli web uygulama güvenlik tehditleri arasında yer almaktadır.
SQL Injection Nasıl Çalışır?
SQL Injection, uygulamanın kullanıcıdan aldığı verileri doğrudan ve güvenlik kontrolü yapmadan SQL sorgularına dahil etmesiyle gerçekleşir. Saldırgan, normalde veri girişine yazılması beklenen metin yerine, özel SQL ifadeleri ekleyerek veri tabanında yetkisiz işlemler yapabilir.
Örnek zayıf kod:
SELECT * FROM users WHERE username = 'kullanici' AND password = 'sifre';
Bir saldırgan şu şekilde zararlı bir giriş yapabilir:
kullanici: admin' --
sifre: (boş)
Böylece sorgu şu hale gelir:
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
-- ifadesi, SQL'de yorum satırı başlangıcıdır. Böylece şifre kontrolü devre dışı bırakılır ve saldırgan giriş yapabilir.
SQL Injection Çeşitleri
- Klasik (Classic) SQL Injection: Hatalı kullanıcı girişleri ile doğrudan veri çekme veya değiştirme işlemleri.
- Blind SQL Injection: Doğrudan hata mesajı alınamayan, ancak yanıt zamanlarına veya içerik değişikliklerine göre sistem davranışını test eden saldırılar.
- Time-Based Blind SQL Injection: Sunucunun yanıt süresini ölçerek veri sızdırmaya dayalı saldırılar.
- Union-Based SQL Injection: UNION operatörünü kullanarak başka veri tablolarına erişim sağlama.
Gerçek Hayattan SQL Injection Örnekleri
- 2008 Heartland Payment Systems: Bir SQL Injection açığı sonucunda milyonlarca kredi kartı bilgisi çalındı.
- 2012 Yahoo: SQL Injection nedeniyle 450.000 kullanıcı bilgisi sızdırıldı.
SQL Injection Nasıl Önlenir?
- Parametreli Sorgular (Prepared Statements) Kullanın: Kullanıcı verilerini doğrudan SQL içine gömmek yerine parametre kullanın.
-- PHP PDO Örneği
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);
- ORM (Object Relational Mapping) Araçlarını Tercih Edin: Doctrine, Hibernate gibi ORM araçları otomatik parametre kullanımı ile SQL Injection riskini azaltır.
- Input Validation ve Output Escaping Yapın: Kullanıcıdan gelen tüm verileri beyaz liste (whitelist) doğrulaması ile kontrol edin. Çıkışlarda HTML/SQL escape işlemleri uygulayın.
- Web Application Firewall (WAF) Kullanın: Bilinen SQL Injection imzalarına karşı uygulamayı koruyan bir katman oluşturun.
- Minimum Yetkili Database Kullanımı: Web uygulamasının kullandığı veritabanı hesabına sadece ihtiyaç duyduğu yetkileri verin.
İlgili Güvenlik Standartları
- OWASP Top 10: SQL Injection, yıllardır OWASP listesinde en kritik uygulama güvenlik açıkları arasında yer alıyor.
- ISO/IEC 27001: Bilgi güvenliği yönetim sistemi (BGYS) standartları içinde güvenlik açıklarının yönetimi vurgulanır.
Sık Yapılan Hatalar ve Çözümleri
| Hata | Sonuç | Çözüm |
|---|---|---|
| Kullanıcı girdisini doğrudan sorguya eklemek | SQL Injection riski | Parametreli sorgular kullanmak |
| Girdi doğrulaması yapmamak | Zararlı veri girişine izin verilmesi | Input validation ile veri kontrolü |
| Admin kullanıcı için yüksek yetkili veritabanı hesabı kullanmak | Geniş kapsamlı veri sızıntıları | Yetki sınırlaması yapmak |
| Güncel olmayan yazılım kullanmak | Bilinen güvenlik açıklarının sömürülmesi | Yazılımları ve kütüphaneleri güncel tutmak |
Özet ve Güvenlik Tavsiyeleri
- Her zaman parametreli sorgular kullanın.
- Kullanıcı girişlerini mutlaka doğrulayın ve filtreleyin.
- En az yetki prensibiyle veritabanı hesapları oluşturun.
- Web Application Firewall (WAF) ile uygulamanızı ek koruma altına alın.
- OWASP Top 10 gibi güvenlik rehberlerini düzenli olarak takip edin.
- Yılda en az bir kez güvenlik testi (penetrasyon testi) gerçekleştirin.
SQL Injection, doğru önlemler alındığında tamamen önlenebilir bir güvenlik açığıdır. Güvenli kodlama alışkanlıklarını benimseyerek ve modern güvenlik pratiklerini uygulayarak, uygulamalarınızı bu tür tehlikeli saldırılardan koruyabilirsiniz.
-
Gürkan Türkaslan
- 13 Ocak 2020, 23:14:58