SQL Injection Nedir? Nasıl Korunulur?
SQL Injection Nedir?
SQL Injection (SQL Enjeksiyonu), bir saldırganın bir web uygulamasındaki güvenlik açıklarından faydalanarak kötü niyetli SQL sorguları çalıştırmasına olanak tanıyan bir saldırı türüdür. Bu tür saldırılar, veritabanına yetkisiz erişim sağlamaktan, hassas bilgileri çalmaya, verileri değiştirmeye veya tamamen silmeye kadar ciddi güvenlik tehditleri oluşturabilir.

SQL Injection Nasıl Çalışır?
SQL Injection saldırıları, genellikle kullanıcı giriş formları veya URL parametreleri aracılığıyla gerçekleşir. Saldırganlar, veritabanı sorgularının içine kötü niyetli SQL komutları ekleyerek yetkisiz işlemler yapabilir. Örneğin, bir web sitesi aşağıdaki gibi bir SQL sorgusu kullanıyorsa:
SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "';
Burada username
ve password
değerleri doğrudan kullanıcıdan alınmaktadır. Eğer bir saldırgan aşağıdaki gibi bir giriş yaparsa:
Username: ' OR '1'='1
Password: ' OR '1'='1
Sorgu şu hale gelir:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
Bu durumda, 1=1
ifadesi her zaman doğru olacağından saldırgan, herhangi bir geçerli kullanıcı adı ve şifre girmeden sisteme giriş yapabilir.
SQL Injection Çeşitleri
1. Klasik SQL Injection
Saldırganın giriş formlarına SQL komutları enjekte ederek veritabanı üzerinde değişiklik yapmasını veya veri çekmesini sağlayan temel saldırı yöntemidir.
2. Blind SQL Injection (Kör SQL Enjeksiyonu)
Web uygulamalarında hata mesajları gösterilmediğinde kullanılır. Saldırgan, sistemin tepkisini analiz ederek veritabanı hakkında bilgi edinmeye çalışır.
3. Time-Based SQL Injection
Veritabanının yanıt süresine dayanarak yapılan saldırıdır. Örneğin, SQL sorgusuna SLEEP(5)
eklenerek sistemin tepkisi gözlemlenir.
4. Union-Based SQL Injection
Birleştirme (UNION
) işlemi ile saldırganın farklı veritabanı tablolarından veri çekmesini sağlayan saldırıdır.
5. Error-Based SQL Injection
Hata mesajları üzerinden veri sızdırma yöntemidir. Örneğin, yanlış bir sorgu gönderildiğinde veritabanının döndürdüğü hata mesajları saldırganlara ipucu verebilir.
SQL Injection’a Karşı Alınabilecek Önlemler
SQL Injection saldırılarından korunmak için aşağıdaki güvenlik önlemleri alınmalıdır:
1. Hazırlıklı (Parameterized) Sorgular Kullanmak
Kullanıcı girdileri doğrudan SQL sorgularına eklenmemeli, yerine hazırlıklı ifadeler (Prepared Statements) kullanılmalıdır. Örneğin, PHP ve MySQL için:
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
Bu yöntemle, kullanıcı girişleri doğrudan SQL ifadesinin içine yerleştirilmez ve enjeksiyon saldırıları engellenir.
2. ORM Kullanımı
ORM (Object-Relational Mapping) kütüphaneleri, SQL sorgularını otomatik olarak oluşturduğu için doğrudan SQL Injection riskini azaltır. Örneğin, Python’da SQLAlchemy kullanımı:
user = session.query(User).filter_by(username=username).first()
3. Giriş Verilerini Doğrulamak ve Temizlemek
Kullanıcının girdiği veriler kesinlikle filtrelenmeli ve özel karakterler temizlenmelidir. Örneğin:
- E-posta adresleri için belirli format kontrolü yapılmalı
- Yalnızca beklenen veri türleri kabul edilmeli (Örneğin, sayısal değerler
is_numeric()
ile kontrol edilebilir)
4. Minimum Yetkilendirme Kullanmak
Veritabanı kullanıcılarına minimum yetki verilmelidir. Web uygulamasının kullandığı veritabanı kullanıcı hesabının yalnızca gerekli izinlere sahip olması sağlanmalıdır.
5. Web Güvenlik Duvarı (WAF) Kullanmak
Bir Web Application Firewall (WAF) kullanarak, SQL Injection saldırıları tespit edilip engellenebilir. Örneğin, ModSecurity gibi açık kaynaklı WAF çözümleri kullanılabilir.
6. Hata Mesajlarını Gizlemek
Hata mesajlarında veritabanı detaylarının gösterilmesi engellenmelidir. Bunun yerine kullanıcıya sadece genel hata mesajları gösterilmelidir.
7. Güvenlik Testleri ve Penetrasyon Testleri Yapmak
Web uygulamalarına düzenli olarak güvenlik testleri uygulanmalı ve SQL Injection testleri yapılmalıdır. SQLMap gibi otomatik araçlar saldırıları tespit etmek için kullanılabilir.
Sonuç
SQL Injection, ciddi güvenlik açıkları yaratabilen tehlikeli bir saldırı türüdür. Ancak, güvenli kod yazma uygulamalarına dikkat edilerek ve gerekli güvenlik önlemleri alınarak bu tür saldırılardan korunmak mümkündür. Veritabanı sorgularında hazırlıklı ifadeler kullanmak, giriş verilerini doğrulamak ve minimum yetkilendirme prensibini benimsemek, SQL Injection saldırılarından korunmada temel yaklaşımlar arasında yer almaktadır. Güvenliği sağlamak için sürekli testler ve güncellemeler yapılmalı, en iyi uygulamalar takip edilmelidir.