SQL Injection açıklarını manuel test etme, bir web sitesindeki form, URL parametresi, çerez, arama kutusu veya API girdisinin veritabanı sorgularını etkileyip etkilemediğini kontrollü ve yetkili şekilde doğrulama sürecidir. Webmasterlar için amaç saldırı yapmak değil; hata mesajı, anormal yanıt, beklenmeyen filtreleme davranışı veya sorgu mantığı bozulması gibi belirtileri erken yakalamak, ardından parametreli sorgular, giriş doğrulama, yetki sınırlama ve güvenli sunucu yapılandırmasıyla açığı kalıcı olarak kapatmaktır.
Bu rehber, canlı müşteri verisini riske atmadan uygulanabilecek savunma odaklı bir kontrol listesi sunar. Testleri yalnızca kendi sitenizde, yazılı izin bulunan projelerde veya staging ortamında yapmalısınız. Veri çekmeye, kimlik doğrulama atlatmaya, tablo keşfine ya da yetkisiz sistemlere deneme yapmaya yönelik işlemler bu makalenin kapsamı dışındadır. Buradaki yaklaşım; belirtileri tanımak, kanıtı minimum seviyede toplamak, düzeltmeyi uygulamak ve tekrar test etmektir.
SQL Injection Nedir ve Webmaster İçin Neden Kritik?
SQL Injection, kullanıcıdan gelen verinin güvenli biçimde ayrıştırılmadan SQL sorgusuna eklenmesiyle oluşan bir güvenlik açığıdır. Örneğin arama, filtreleme, ürün detayı, giriş formu, sipariş sorgulama veya yönetim paneli listeleme ekranı gibi alanlarda kullanıcı girdisi veritabanı sorgusunu değiştirebiliyorsa risk vardır. Sonuç; veri sızıntısı, yetkisiz işlem, içerik manipülasyonu, kullanıcı hesaplarının ele geçirilmesi veya sitenin tamamen devre dışı kalması olabilir.
OWASP Top 10 listelerinde injection sınıfı yıllardır üst sıralardadır. Küçük bir blogdan e-ticaret altyapısına kadar her ölçekte proje etkilenebilir. Özellikle eski PHP uygulamaları, güncellenmemiş eklentiler, özel yazılmış admin panelleri, hatalı ORM kullanımı ve loglanmayan API uçları risk taşır. Güvenli bir barındırma katmanı bu riski tek başına ortadan kaldırmaz; fakat güncel PHP sürümleri, izole hosting hesapları, WAF, düzenli yedekleme ve SSL gibi kontroller hasarı azaltır. Bu noktada altyapınızı da gözden geçirmek için web hosting ve SSL sertifikası sayfalarına doğal bir kontrol adımı olarak bakabilirsiniz.
Manuel Teste Başlamadan Önce Güvenli Hazırlık
Manuel testin kalitesi, hazırlıkla doğru orantılıdır. Rastgele denemeler yapmak yerine kapsam, ortam, kayıt ve geri dönüş planı belirlenmelidir. Özellikle üretim ortamında test yapılıyorsa performans etkisi ve yanlış pozitifler dikkatle yönetilmelidir. En güvenli yaklaşım, aynı kod ve benzer veritabanı şemasıyla çalışan bir staging kopyasında test yapmaktır.
1. Kapsamı ve Yetkiyi Netleştirin
- Test edilecek domain, subdomain, panel ve API uçlarını listeleyin.
- Yetkiniz olmayan üçüncü taraf servisleri kapsam dışında bırakın.
- Test saatini düşük trafik dönemine alın.
- Veri değiştiren işlemleri mümkünse test kullanıcısı ve test verisiyle sınırlayın.
- Hata anında geri dönebileceğiniz yedek ve erişim bilgilerini hazır tutun.
Eğer yeni bir proje yayına alınacaksa domain, DNS ve hosting geçişi sırasında güvenlik kontrolünü ertelemeyin. Yayına çıkmadan önce domain sorgulama ve Linux hosting gibi altyapı adımlarının yanında güvenli kod kontrolü de yapılmalıdır.
2. Uygulamanın Girdi Haritasını Çıkarın
SQL Injection genellikle kullanıcının veri gönderdiği noktalarda ortaya çıkar. Bu nedenle önce yüzeyi haritalayın. Aşağıdaki alanları tek tek not alın: URL parametreleri, POST formları, arama kutuları, kategori filtreleri, sıralama parametreleri, sepet ve sipariş alanları, kullanıcı profili, yorum formları, admin paneli listeleri, JSON API gövdeleri, HTTP başlıkları ve çerezler. Her alan için beklenen veri tipini yazın. Örneğin id sayısal mı, slug metin mi, tarih alanı belirli formatta mı, sıralama sadece izinli kolonlardan mı seçiliyor?
3. Loglama ve Yedeklemeyi Açın
Test sırasında uygulama logları, web sunucusu erişim logları ve veritabanı hata logları değerli kanıt sağlar. Ancak üretimde ayrıntılı veritabanı hatalarını kullanıcıya göstermek hatadır. Doğru uygulama; hatayı kullanıcıya genel bir mesajla göstermek, ayrıntıyı ise güvenli log kanalına yazmaktır. Testten önce güncel yedek alın. Kritik sitelerde dosya yedeği, veritabanı yedeği ve yapılandırma yedeği ayrı ayrı saklanmalıdır. Hostragons tarafında kullandığınız altyapıya göre yedekleme planınızı hosting yedekleme içeriğiyle birlikte değerlendirebilirsiniz.
SQL Injection Açıklarını Manuel Test Etme: Adım Adım Kontrol Listesi
Aşağıdaki adımlar, zararsız gözlem ve doğrulama mantığına dayanır. Amaç veri almak değil; bir girdinin sorgu mantığını bozup bozmadığını anlamaktır. Her testte önce normal davranışı kaydedin, sonra yalnızca küçük ve geri alınabilir değişikliklerle yanıt farkını gözlemleyin.
Adım 1: Normal Yanıtı Referans Alın
Bir ürün detay sayfası, arama formu veya kullanıcı filtreleme ekranı seçin. Normal parametreyle sayfanın HTTP durum kodunu, yanıt süresini, kayıt sayısını, sayfa başlığını ve ekranda görünen mesajı not edin. Örneğin ürün sayfası 200 yanıt veriyor, 120 ms içinde açılıyor ve tek ürün gösteriyorsa bu sizin referansınız olur. Referans olmadan yapılan testlerde her yavaşlık veya hata yanlışlıkla açık sanılabilir.
Adım 2: Tip Uyumsuzluğu ve Basit Ayrıştırma Hatalarını Denetleyin
Sayısal beklenen bir alana metinsel değer, metin beklenen bir alana beklenmeyen özel karakter, tarih beklenen bir alana farklı format gönderildiğinde uygulama nasıl davranıyor? Güvenli uygulama ya girdiyi reddeder ya da kontrollü hata döndürür. Riskli uygulama ise veritabanı hata mesajını ekrana basabilir, kayıt sayısını değiştirebilir veya sayfa yapısını bozabilir. Burada dikkat edilmesi gereken nokta, hata mesajının içeriğidir. SQL sözdizimi, tablo adı, kolon adı, sürücü adı veya sorgu parçası görünüyorsa bilgi sızıntısı vardır ve injection olmasa bile düzeltilmelidir.
Adım 3: Mantıksal Yanıt Farklarını Gözlemleyin
Bazı açıklar doğrudan hata üretmez; yalnızca sayfanın gösterdiği sonuç değişir. Örneğin aynı filtre alanında normal koşulda 3 ürün görünürken küçük bir mantık değişikliği sonrasında sonuç sayısı beklenmedik şekilde artıyor veya sıfırlanıyorsa sorgu kullanıcı girdisinden etkileniyor olabilir. Bu aşamada veri çekmeye çalışmadan, yalnızca yanıt farkı olup olmadığını kaydedin. Güvenli sistemlerde kullanıcı girdisi parametre olarak işlendiği için özel karakterler sorgu mantığını değiştirmez; sadece aranan metnin bir parçası sayılır.
Adım 4: Hata Mesajlarını ve HTTP Kodlarını İnceleyin
SQL Injection belirtisi her zaman ekranda patlayan bir hata değildir. Bazen 500 hatası, boş beyaz sayfa, farklı yönlendirme, beklenmeyen 403 yanıtı veya uzun süren istek şeklinde görülür. Web sunucusu loglarında aynı istek için uygulama seviyesinde istisna oluşuyorsa, ilgili kod bloğu incelenmelidir. Özellikle şu ifadeler risk sinyali olabilir: database error, SQL syntax, unknown column, unclosed quotation, PDO exception, MySQL error, PostgreSQL error veya ORM sorgu hataları. Üretimde bu detayların kullanıcıya gösterilmesi kapatılmalıdır.
Adım 5: API ve AJAX Uçlarını Unutmayın
Modern sitelerde birçok sorgu görünür sayfa yerine arka plandaki API uçlarından çalışır. Tarayıcı geliştirici araçlarında Network sekmesini açarak JSON isteklerini, filtreleme endpointlerini ve admin paneli AJAX çağrılarını inceleyin. API tarafında da aynı güvenlik prensibi geçerlidir: veri tipi kontrol edilmeli, izinli değer listesi uygulanmalı, parametreli sorgu kullanılmalı ve hata çıktısı sadeleştirilmelidir. API güvenliğiyle ilgili daha geniş kontroller için API güvenliği içeriğine bağlantı vermek faydalı olacaktır.
Adım 6: Yetki Kontrolünü SQL Güvenliğiyle Birlikte Test Edin
SQL Injection yalnızca sorgu yazımıyla ilgili değildir; yetki tasarımı da önemlidir. Bir kullanıcının sadece kendi siparişlerini görmesi gerekirken id parametresi değişince başka siparişe erişebiliyorsa bu doğrudan injection olmayabilir, fakat ciddi bir erişim kontrolü açığıdır. Güvenli uygulama, sorguda kullanıcı id bilgisini sunucu tarafındaki oturumdan almalı ve istemciden gelen id değerine güvenmemelidir. Bu kontrol özellikle müşteri paneli, fatura, destek talebi ve üyelik sistemlerinde kritiktir.
Manuel Test Bulgularını Nasıl Yorumlamalı?
| Belirti | Olası Anlam | Önerilen Aksiyon |
|---|---|---|
| SQL hata mesajı ekranda görünüyor | Hata yönetimi zayıf, olası injection riski var | Hata gösterimini kapatın, loglamayı güvenli kanala alın, sorguyu inceleyin |
| Özel karakter sonrası sonuç sayısı değişiyor | Girdi sorgu mantığını etkiliyor olabilir | Parametreli sorguya geçin, veri tipi doğrulaması ekleyin |
| Sayısal id metin girilince 500 hatası veriyor | Validasyon ve istisna yönetimi eksik | Sayısal doğrulama, kontrollü 400 yanıtı ve merkezi hata yakalama uygulayın |
| API ayrıntılı veritabanı hatası döndürüyor | Bilgi sızıntısı ve saldırı yüzeyi artışı | Genel hata mesajı döndürün, ayrıntıyı sunucu logunda tutun |
| Test ortamında sorun yok, canlıda var | Konfigürasyon veya sürüm farkı bulunabilir | PHP, eklenti, veritabanı modu ve çevre değişkenlerini karşılaştırın |
Bir bulgunun gerçek açık olup olmadığını anlamak için en az iki kanıt arayın: yanıt farkı ve log kaydı gibi. Tek bir 500 hatası her zaman SQL Injection demek değildir; dosya izni, bellek limiti veya eklenti çakışması da olabilir. Ancak veritabanı hatasıyla birlikte kullanıcı girdisi aynı noktaya işaret ediyorsa öncelik yüksek olmalıdır.
SQL Injection Açıklarını Kapatma Yolları
Kalıcı çözüm, tek bir güvenlik eklentisi kurmak değildir. Doğru çözüm katmanlıdır: güvenli kod, sınırlı veritabanı hesabı, sağlam hata yönetimi, güncel altyapı, izleme ve düzenli test birlikte uygulanmalıdır.
1. Parametreli Sorgu ve Prepared Statement Kullanın
En temel savunma, kullanıcı girdisini SQL metnine birleştirmemektir. PHP PDO örneğinde güvenli yaklaşım şu mantıktadır: `prepare` ile sorgu şablonu oluşturulur, kullanıcı verisi `execute` aşamasında parametre olarak verilir. Örnek: `$stmt = $pdo->prepare('SELECT id, title FROM posts WHERE slug = ?'); $stmt->execute([$slug]);`. Bu yöntemde veritabanı, girdiyi komut değil veri olarak işler.
ORM kullanıyorsanız da dikkatli olun. Laravel, Symfony, Django veya benzeri yapılarda standart query builder çoğu durumda güvenlidir; ancak raw query yazıldığında risk geri gelir. Raw SQL zorunluysa parametre bağlama kullanılmalı, string birleştirme yapılmamalıdır.
2. Giriş Doğrulama ve İzinli Liste Uygulayın
Parametreli sorgu ana savunmadır; fakat validasyon ikinci güçlü katmandır. id alanı yalnızca pozitif tam sayı olmalı, tarih ISO formatında olmalı, e-posta alanı e-posta formatına uymalı, sıralama parametresi ise yalnızca izinli kolonlardan seçilmelidir. Özellikle `order by` gibi kolon adı veya yön belirleyen alanlarda parametre bağlama her zaman yeterli olmayabilir. Bu durumda izinli liste kullanın: örneğin sıralama sadece price, created_at ve title olabilir; yön ise asc veya desc ile sınırlanır.
3. Veritabanı Kullanıcısının Yetkilerini Sınırlayın
Web uygulamasının veritabanı kullanıcısı her şeyi yapabilen yönetici olmamalıdır. Çoğu sitede uygulama hesabına yalnızca gerekli SELECT, INSERT, UPDATE ve DELETE yetkileri verilir; DROP, ALTER, CREATE gibi yetkiler üretimde kapatılır. Raporlama için ayrı salt okunur kullanıcı, bakım için ayrı yönetici hesabı kullanılabilir. Böylece bir açık oluşsa bile etki alanı daralır.
4. Hata Yönetimini Güvenli Hale Getirin
Üretim ortamında ayrıntılı hata gösterimini kapatın. Kullanıcıya genel bir mesaj verin: işlem şu anda tamamlanamadı gibi. Ayrıntılı istisnalar, sorgu bilgisi, dosya yolu ve stack trace yalnızca erişimi kısıtlı loglarda bulunmalıdır. Loglar düzenli döndürülmeli, hassas veri maskelemesi yapılmalı ve yetkisiz erişime kapalı tutulmalıdır.
5. WAF, Güncel Sürümler ve Hosting Katmanını Kullanın
Web Application Firewall, kötü niyetli kalıpları engellemede ek katman sağlar; ancak hatalı kodun yerine geçmez. PHP, Node.js, Python paketleri, CMS çekirdeği, tema ve eklentiler güncel tutulmalıdır. Eski sürümler hem bilinen SQL Injection açıkları hem de hata yönetimi zafiyetleri içerebilir. WordPress kullanan webmasterlar için WordPress güvenliği rehberi, eklenti seçimi ve güncelleme disiplini açısından iyi bir tamamlayıcıdır.
Hosting tarafında izole hesap yapısı, güncel veritabanı sürümü, düzenli yedekleme, güvenli dosya izinleri ve SSL kullanımı önemlidir. SSL SQL Injection açığını kapatmaz; ancak kullanıcı verisinin ağ üzerinde korunmasını sağlar. Özellikle giriş, ödeme ve müşteri paneli olan sitelerde SSL sertifikası kullanımı temel gerekliliktir.
6. Güvenli Kod İncelemesi ve Tekrar Test Yapın
Düzeltmeden sonra aynı manuel testleri tekrar uygulayın. Beklenen sonuç şudur: özel karakterler sorgu mantığını değiştirmez, hatalar kullanıcıya ayrıntı vermez, loglarda kontrol edilen istisnalar dışında veritabanı hatası görünmez ve yetki kontrolleri bozulmaz. Kod incelemesinde string birleştirme ile SQL oluşturan yerleri arayın. Büyük projelerde basit bir arama bile faydalıdır: SELECT, WHERE, ORDER BY, raw, query, exec gibi kelimelerin geçtiği dosyalar incelenebilir.
Webmasterlar İçin Pratik Güvenlik Rutini

SQL Injection güvenliği tek seferlik kontrol değil, düzenli bakım sürecidir. Aylık olarak CMS ve eklenti güncellemelerini kontrol edin. Üç ayda bir kritik formları ve API uçlarını manuel gözden geçirin. Büyük kod değişikliklerinden sonra veritabanı sorgularını yeniden inceleyin. Yeni geliştirilen her özellik için şu 5 soruyu sorun: Bu alan kullanıcı girdisi alıyor mu? Veri tipi doğrulanıyor mu? Sorgu parametreli mi? Hata kullanıcıya detay gösteriyor mu? Bu işlem için veritabanı kullanıcısının yetkisi gerçekten gerekli mi?
Ek olarak, yedeklerin geri yüklenebilir olduğunu test edin. Birçok site yedek aldığını düşünür fakat geri dönüş denemesi yapılmadığı için kriz anında sorun yaşar. Güvenli hosting, sağlam yedekleme ve disiplinli kod geliştirme birlikte çalıştığında SQL Injection riski önemli ölçüde azalır.
Sık Yapılan Hatalar
- Sadece istemci tarafı JavaScript doğrulamasına güvenmek. Saldırgan tarayıcıyı kullanmak zorunda değildir; sunucu tarafı doğrulama şarttır.
- Tek tırnakları temizlemenin yeterli olduğunu sanmak. Modern savunma, karakter silme değil parametreli sorgudur.
- Admin panelini güvenli kabul etmek. Yönetim panelleri de kullanıcı girdisi alır ve test edilmelidir.
- ORM kullanınca her sorgunun otomatik güvenli olduğunu düşünmek. Raw query ve dinamik sıralama alanları risk doğurabilir.
- Veritabanı hesabına gereğinden fazla yetki vermek. En az ayrıcalık prensibi uygulanmalıdır.
- Canlı ortamda ayrıntılı hata gösterimini açık bırakmak. Bu, saldırgan için yol haritası olabilir.
Özet Tablo: Test ve Kapatma Öncelikleri
| Öncelik | Yapılacak İş | Beklenen Sonuç |
|---|---|---|
| Yüksek | Parametreli sorguya geçiş | Kullanıcı girdisi SQL komutu olarak çalışmaz |
| Yüksek | Üretimde hata detaylarını kapatma | Tablo, kolon ve sorgu bilgisi sızmaz |
| Yüksek | Veritabanı yetkilerini azaltma | Olası açığın etkisi sınırlanır |
| Orta | WAF ve güvenlik kuralları | Bilinen zararlı istekler filtrelenir |
| Orta | Düzenli manuel tekrar test | Yeni kod değişiklikleri erken yakalanır |
| Orta | Yedek ve geri dönüş testi | Olay sonrası toparlanma hızlanır |
Sıkça Sorulan Sorular
SQL Injection açıklarını manuel test etme yasal mı?
Yalnızca kendi sistemlerinizde veya yazılı izin aldığınız projelerde yasaldır. Üçüncü taraf sitelerde izinsiz deneme yapmak hukuki ve etik değildir. Test kapsamı, saat aralığı ve yöntemler önceden netleştirilmelidir.
Tek başına WAF kullanmak SQL Injection riskini bitirir mi?
Hayır. WAF ek bir koruma katmanıdır, fakat hatalı sorgu yazımını düzeltmez. Kalıcı çözüm parametreli sorgu, giriş doğrulama, güvenli hata yönetimi ve en az ayrıcalık prensibidir.
WordPress sitelerde SQL Injection en çok nereden çıkar?
Genellikle güncellenmemiş eklentiler, güvenilmeyen temalar, özel yazılmış kısa kodlar, AJAX endpointleri ve hatalı form işlemlerinden kaynaklanır. Çekirdek, tema ve eklentiler güncel tutulmalı; kullanılmayan eklentiler kaldırılmalıdır.
SQL Injection ile erişim kontrolü açığı aynı şey mi?
Hayır. SQL Injection sorgu mantığının kullanıcı girdisiyle değişmesidir. Erişim kontrolü açığı ise kullanıcının görmemesi gereken kaynağa ulaşabilmesidir. Ancak ikisi aynı ekranda birlikte bulunabilir ve birlikte test edilmelidir.
Açığı kapattığımı nasıl doğrularım?
Düzeltmeden sonra aynı girdilerle tekrar test yapın. Sonuçlar değişmemeli, ayrıntılı veritabanı hatası görünmemeli, loglarda kontrolsüz SQL hatası oluşmamalı ve yetki kontrolleri doğru çalışmalıdır. Kritik sistemlerde bağımsız kod incelemesi veya güvenlik testi önerilir.
Kapanış
SQL Injection açıklarını manuel test etme süreci, webmasterlar için teknik bir lüks değil, düzenli bakım sorumluluğudur. Güvenli test yaklaşımıyla riskli girdileri bulabilir, parametreli sorgular ve doğru yetkilendirmeyle kalıcı çözüm üretebilirsiniz. Hostragons altyapısında sitenizi barındırırken güncel hosting, SSL, yedekleme ve güvenlik katmanlarını birlikte değerlendirmeniz uzun vadeli dayanıklılığı artırır. İsterseniz mevcut sitenizin barındırma ve güvenlik ihtiyaçlarını satış baskısı olmadan gözden geçirmek için Hostragons çözümlerine bakabilirsiniz.