SQL Injection Nedir? Temel Kavramlar ve Tehditin Büyüklüğü

SQL Injection, bir saldırganın web uygulamasının veri tabanı sorgularına kötü amaçlı SQL kodu enjekte etmesiyle gerçekleşen bir güvenlik açığıdır. Bu açık, özellikle kullanıcı girdileri doğrudan sorguya eklenmediğinde ortaya çıkar ve saldırganın veri çalması, veri silmesi ya da yönetici yetkileri kazanması gibi ciddi sonuçlar doğurur. 2023‑2024 yıllarında yapılan araştırmalara göre, tüm web uygulamalarının %30‑40’ı hâlâ en az bir SQL Injection zafiyeti barındırmaktadır.
SQL Injection’ın etkileri sadece veri kaybı ile sınırlı değildir; aynı zamanda itibar kaybı, yasal sorumluluk ve yüksek tamir maliyetleri de doğurur. Örneğin, 2022 yılında bir e‑ticaret sitesinde yaşanan saldırı sonucunda 1,2 Milyon USD’lik zarara yol açılmıştır. Bu tür bir kayıp, genellikle güvenlik önlemlerine yeterince yatırım yapılmamasından kaynaklanır. Bu yüzden geliştiricilerin ve sistem yöneticilerinin SQL Injection’ı tanıması ve önlemesi kritik bir gerekliliktir.
SQL Injection’ın Çalışma Prensibi: Örnek Senaryolar ve Yaygın Hatalar
SQL Injection, temel olarak iki adımda gerçekleşir: girdi toplama ve girdi manipülasyonu. Kullanıcıdan gelen veri doğrudan sorguya eklenirse, saldırgan bu veriyi “’ OR 1=1 -- ” gibi bir ifadeyle genişleterek sorgunun mantığını değiştirir. Aşağıdaki örnek, PHP ile hazırlanmış bir login fonksiyonunu göstermektedir:
<?php
$username = $_POST['user'];
$password = $_POST['pass'];
$sql = "SELECT * FROM users WHERE user='$username' AND pass='$password'";
$result = mysqli_query($conn, $sql);
?>
Bu kodda $username ve $password doğrudan sorguya eklenmiş, hiçbir doğrulama ya da kaçış (escaping) yapılmamıştır. Saldırgan “admin'-- ” gibi bir girdi gönderdiğinde, sorgu “SELECT * FROM users WHERE user='admin'-- ’ AND pass='…'” haline gelir ve şifresiz giriş sağlanır. En yaygın hatalar arasında şunlar yer alır:
- Parametreleri doğrudan string birleştirme ile sorguya eklemek.
- Girdi doğrulama eksikliği; özellikle sayısal ve tarih tiplerinde.
- Eski sürüm veritabanı sürücülerinin (ör. mysql_* fonksiyonları) kullanılması.
Bu hatalar, saldırganların sadece veri çalmasını değil, aynı zamanda veri tabanını tamamen kontrol altına almasını da mümkün kılar. Bu yüzden hatalı kodlamanın maliyeti, sadece bir kaç saatlik geliştirme süresinden çok daha fazladır.
SQL Injection Önleme Stratejileri: En İyi Uygulamalar ve Araçlar
SQL Injection’ı önlemenin en etkili yolu, girdi doğrulama, parametrik sorgular ve güvenlik duvarları gibi katmanlı bir yaklaşım benimsemektir. Parametrik sorgular (prepared statements) sayesinde, veritabanı motoru girdi değerlerini sorgunun yapısal kısmından ayırır ve bu sayede enjeksiyon imkânı ortadan kalkar. Örneğin, PDO ile hazırlanmış bir sorgu şu şekilde görünür:
<?php
$stmt = $pdo->prepare('SELECT * FROM users WHERE user = :user AND pass = :pass');
$stmt->execute(['user' => $username, 'pass' => $password]);
$rows = $stmt->fetchAll();
?>
Bu yöntem, veri tipinin otomatik olarak bağlanmasını sağlar ve “’ OR 1=1” gibi karakterlerin sorguya karışmasını engeller. Ayrıca aşağıdaki ek önlemler de alınmalıdır:
- Girdi doğrulama ve beyaz listeleme: Kullanıcı adı, e‑posta gibi alanlar için regex kullanarak sadece izin verilen karakterleri kabul edin.
- ORM (Object‑Relational Mapping) araçları: Laravel Eloquent, Doctrine gibi modern çerçeveler, otomatik olarak parametrik sorgular üretir.
- WAF (Web Application Firewall) kullanımı: WAF güvenlik duvarı sayesinde bilinen saldırı kalıpları anında engellenir.
- Veri tabanı ayrıcalıklarını sınırlama: Uygulama hesabının sadece gerekli SELECT/INSERT/UPDATE izinlerine sahip olması, bir saldırı durumunda zararı azaltır.
Bu önlemler, tek başına yeterli olmayabilir; bu yüzden defansif kodlama kültürünün ekip içinde yer alması önemlidir.
Adım Adım SQL Injection Önleme Kılavuzu: Uygulama İçin Pratik Rehber

Bu bölümde, bir web projesinde SQL Injection’ı tamamen ortadan kaldırmak için izlenmesi gereken 7 adımlı bir yol haritası sunuyoruz. Her adım, geliştiricinin günlük iş akışına entegre edilebilecek pratik bir görevdir.
- Girdi Kontrolü ve Temizleme: Tüm POST/GET parametrelerini
filter_input()veya benzeri fonksiyonlarla temizleyin. Sayısal alanlar içinintval(), e‑posta içinfilter_var($email, FILTER_VALIDATE_EMAIL)kullanın. - Parametrik Sorgulara Geçiş: Eski
mysql_query()vemysqli_query()fonksiyonlarınımysqli_prepare()veya PDOprepare()ile değiştirin. - ORM ve Framework Kullanımı: Laravel, Symfony veya CodeIgniter gibi çerçeveler, yerleşik olarak parametrik sorgular üretir. Bu çerçeveleri projeye entegre edin.
- Veri Tabanı Kullanıcı Haklarını Sınırlama: Uygulama için ayrı bir veri tabanı kullanıcısı oluşturun ve sadece gerekli izinleri verin (ör. SELECT, INSERT).
- WAF ve Güvenlik Modülleri: WAF güvenlik duvarı kurarak, bilinen SQL Injection imzalarını otomatik olarak engelleyin.
- Güvenlik Testleri ve Penetrasyon Testi: Otomatik araçlarla (SQLMap, Burp Suite) periyodik testler yapın. Açık tespit edildiğinde acilen yamalayın.
- Loglama ve İzleme: Şüpheli SQL hatalarını ve başarısız giriş denemelerini loglayın. veri merkezimiz üzerinden merkezi log yönetimi sağlayın.
Bu adımları tamamladığınızda, uygulamanızın SQL Injection riski %95’in üzerinde azalır ve güvenlik denetimlerinden sorunsuz geçer.
SQL Injection ve Diğer Güvenlik Açıkları: Karşılaştırmalı Tablo
| Açık Türü | Etki Alanı | Önleme Yöntemi | En Yaygın Sebep |
|---|---|---|---|
| SQL Injection | Veri tabanı | Parametrik sorgular, WAF | Doğrudan string birleştirme |
| XSS (Cross‑Site Scripting) | Tarayıcı | HTML kaçış, CSP | HTML içinde doğrudan çıktı |
| CSRF (Cross‑Site Request Forgery) | İstemci oturumu | CSRF token, SameSite çerez | İstemci tarafı doğrulama eksikliği |
| RCE (Remote Code Execution) | Sunucu | Girdi beyaz listesi, sandbox | Komut satırı enjeksiyonu |
Tablodan da görüleceği gibi, SQL Injection en kritik veri tabanı odaklı açığı temsil eder; ancak diğer açıklarla birlikte ele alındığında bütünsel bir güvenlik stratejisi oluşturmak gerekir.
Gerçek Dünya Örneği: E‑Ticaret Sitesinde SQL Injection Nasıl Çözüldü?
2025 yılında bir yerli e‑ticaret platformu, “ürün arama” özelliğinde SQL Injection zafiyeti nedeniyle 2 Milyon TL’lik kayıp yaşamıştı. Saldırgan, search parametresine “%’ OR 1=1-- ” ekleyerek tüm ürünleri listeleyebiliyor ve fiyatları manipüle edebiliyordu. Çözüm süreci şu adımlarla gerçekleşti:
- İlk adımda, e-ticaret hosting paketinin logları incelendi ve saldırı izleri tespit edildi.
- Geliştiriciler, arama fonksiyonunu PDO prepared statements ile yeniden yazdı ve tüm girişler için beyaz liste uygulandı.
- Veri tabanı kullanıcı hakları yeniden yapılandırıldı; sadece SELECT izni verildi.
- WAF konfigürasyonu güncellenerek “UNION SELECT” kalıpları engellendi.
- Son olarak, güvenlik ekibi haftalık penetrasyon testleri planladı.
Bu adımların ardından, sitenin saldırı yüzdesi %0’a düştü ve müşteri memnuniyeti %15 artış gösterdi. Bu örnek, sadece teknik önlemlerin değil, süreç odaklı bir güvenlik kültürünün de önemini vurgular.
Sıkça Sorulan Sorular
SQL Injection nedir ve neden bu kadar tehlikelidir?
SQL Injection, saldırganın veri tabanı sorgularına kötü amaçlı kod enjekte etmesidir. Doğru önlem alınmadığında, veri çalınabilir, silinebilir ya da sistem yönetici hakları elde edilebilir. Bu yüzden veri bütünlüğü ve gizliliği açısından kritik bir risktir.
Parametrik sorgular nasıl çalışır?
Parametrik sorgular, sorgu şablonunu ve veri değerlerini ayrı tutar. Veritabanı motoru, şablonu önce derler ve ardından değerleri bağlar; bu sayede değerlerin içinde bulunan özel karakterler sorgunun yapısını değiştiremez.
WAF kullanmak SQL Injection’ı tamamen engeller mi?
WAF, bilinen saldırı imzalarını engelleyerek ek bir savunma katmanı sağlar, ancak %100 güvenlik garantisi vermez. En iyi sonuç, WAF ile birlikte kod seviyesinde önlemler (prepared statements, input validation) alınmasıdır.
Mevcut bir projede SQL Injection riskini nasıl tespit ederim?
Manuel kod incelemesi, statik analiz araçları (SonarQube, PHPStan) ve otomatik sızma testleri (SQLMap) kullanarak riskli kod parçalarını belirleyebilirsiniz. Ayrıca, veri tabanı hatalarını loglayarak şüpheli aktiviteleri izlemek de etkili bir yöntemdir.
Sonuç: SQL Injection’ı Önlemek İçin Birkaç Temel Adım
SQL Injection, doğru önlemler alındığında tamamen önlenebilen bir güvenlik açığıdır. İlk adım, tüm kullanıcı girdilerini doğrulamak ve temizlemektir; ikinci adım, her zaman parametrik sorgular kullanmaktır. Üçüncü olarak, veri tabanı kullanıcı haklarını en aza indirgeyin ve WAF gibi ek savunma katmanları ekleyin. Dördüncü adımda, düzenli güvenlik testleri ve log takibi yaparak yeni açıkların ortaya çıkmasını önleyin.
Eğer hâlâ web hosting paketleri arasında seçim yapıyorsanız, güvenlik odaklı bir hosting (ör. SEO hosting veya WordPress hosting) tercih ederek, sunucu tarafında da güvenlik önlemlerinin (ör. WAF, güncel PHP sürümü) sağlanmasını garantileyebilirsiniz. Unutmayın, güvenli bir uygulama sadece kodla değil, altyapı ve süreçlerle de korunur. Şimdi, projenizdeki tüm veri tabanı erişimlerini gözden geçirerek bu rehberi uygulamaya koyun ve güvenli bir dijital ortamın keyfini çıkarın.