Kısaca özet
- SQL injection nedir sorusunun kısa cevabı: kullanıcıdan gelen verinin veritabanı sorgusuna doğrudan eklenmesi yüzünden saldırganın sorguyu kendi istediği komuta çevirmesidir.
- Açık bulunan bir formdan üye listesi, parola özetleri ve sipariş bilgileri okunabilir, kayıtlar silinebilir ya da yönetici hesabı oluşturulabilir.
- Kalıcı çözüm kodda yapılır: hazırlanmış ifadeler (prepared statements) sorgu ile veriyi birbirinden ayırır ve açığı kökten kapatır.
- WordPress gibi hazır yazılımlarda açıkların büyük kısmı eklenti ve temalardan gelir; güncel sürüm ve az eklenti riskin çoğunu keser.
- Web uygulaması güvenlik duvarı (WAF) bilinen saldırı kalıplarını filtreler ama kodu düzeltmez; ikinci katmandır.
- Sitenin veritabanı kullanıcısına yalnız ihtiyaç duyduğu yetkiyi vermek, açık istismar edilse bile zararı sınırlar.
Siteniz bir gün yavaşladı, yönetim panelinde tanımadığınız bir yönetici hesabı belirdi ya da müşterilerinizden “üyelik e-postanıza spam geliyor” şikâyetleri başladı. Bu belirtilerin arkasında sık görülen nedenlerden biri SQL injection açığıdır. SQL injection nedir diye sorduğunuzda teknik tanım kısa, ama önemli olan kısmı şu: sorun sunucuda değil, sitenizin kodunda ya da kullandığınız bir eklentide başlar. Hosting firmasını değiştirmek bu açığı kapatmaz; kodun veriyle nasıl konuştuğunu düzeltmek kapatır.
SQL Injection Nedir, Açık Nasıl Oluşur
Dinamik bir web sitesi, ziyaretçinin girdiği veriyi veritabanına sorarak sayfa üretir. Arama kutusuna yazılan kelime, giriş formundaki e-posta adresi ya da adres çubuğundaki ürün numarası bir SQL sorgusunun içine yerleştirilir. Kod bu veriyi sorgu metnine düz bir metin gibi yapıştırıyorsa, saldırgan veri yerine SQL komutunun bir parçasını gönderebilir. Veritabanı bu metni veri olarak değil, komutun devamı olarak okur.
Kavramsal bir örnekle düşünelim. Giriş formu, “e-postası şu olan ve parolası şu olan kullanıcıyı getir” diye bir sorgu kuruyor. Saldırgan e-posta alanına öyle bir metin yazar ki sorgudaki tırnak kapanır ve arkasına her zaman doğru dönen bir koşul eklenir. Sonuçta parola kontrolü devre dışı kalır ve veritabanı ilk kullanıcıyı, çoğu zaman yöneticiyi, geri döndürür. Açığın özü budur: veri ile komut arasındaki sınırın kaybolması.
Bilgi
SQL injection yeni bir saldırı değildir; yirmi yılı aşkın süredir bilinir ve OWASP’ın SQL injection önleme rehberinde korunma yöntemleri açıkça yazılıdır. Hâlâ yaygın olmasının nedeni, eski kodun ve bakımı bırakılmış eklentilerin yıllarca yayında kalmasıdır.
Açık Nerelerde Görülür
SQL injection açığı yalnızca giriş formunda aranmaz. Veritabanına giden her girdi bir kapıdır. Arama kutuları, filtreleme ve sıralama parametreleri, adres çubuğundaki kimlik numaraları, çerez değerleri, hatta HTTP başlıkları bile sorguya ekleniyorsa risk taşır. Özellikle sıralama parametresi gibi tablo ya da sütun adı taşıyan alanlar, geliştiricilerin en sık gözden kaçırdığı yerlerdir.
Hazır içerik yönetim sistemlerinde çekirdek genellikle iyi test edilir. Açıkların çoğu eklentilerde, temalarda ve özel yazılmış küçük modüllerde çıkar. Uzun süredir güncellenmeyen bir form eklentisi ya da bir ajansın yıllar önce yazıp bıraktığı özel bir sorgu, sitenin en zayıf halkasıdır.
Saldırgan Bu Açıkla Neler Yapabilir
Etkinin büyüklüğü, açığın bulunduğu sorguya ve sitenin veritabanı kullanıcısının yetkisine bağlıdır. Aşağıdaki tablo tipik sonuçları ve sizin tarafınızda nasıl görüneceğini özetliyor.
| Saldırganın elde ettiği | Sizin göreceğiniz belirti | İş etkisi |
|---|---|---|
| Üye ve müşteri tablosunu okuma | Çoğu zaman hiçbir belirti yok | Kişisel veri sızıntısı, bildirim yükümlülüğü |
| Parola özetlerini çekme | Müşteri hesaplarında şüpheli girişler | Hesap ele geçirme, itibar kaybı |
| Kayıt ekleme veya değiştirme | Yeni yönetici hesabı, değişmiş fiyatlar | Site kontrolünün kaybı |
| Kayıt silme | Boş sayfalar, eksik siparişler | Veri kaybı, yedekten dönüş |
| Sayfalara zararlı kod gömme | Ziyaretçilerin başka sitelere yönlenmesi | Arama motoru uyarısı, trafik kaybı |
En tehlikeli senaryo ilk satırdır, çünkü sessizdir. Saldırgan veriyi okur ve gider; siteniz çalışmaya devam eder. Aylar sonra müşteri verileriniz başka bir yerde ortaya çıktığında iz sürmek çok daha zordur.
Örnek senaryo
Yedek parça satan küçük bir e-ticaret sitesi, ürünleri filtrelemek için yıllar önce yazdırılmış bir eklenti kullanıyor. Eklentinin geliştiricisi iki yıldır güncelleme yayımlamıyor. Otomatik tarayıcılar filtre parametresindeki açığı buluyor ve üye tablosu kopyalanıyor. İşletme bunu üç ay sonra, müşterilerinden gelen oltalama şikâyetleriyle fark ediyor. Eklenti kaldırılıyor, tüm müşteri parolaları sıfırlanıyor, olay hukuk danışmanıyla birlikte değerlendiriliyor. Yeni eklentiyi seçerken ilk ölçüt son güncelleme tarihi oluyor.

SQL Injection’dan Korunmanın Katmanları
Korunma tek bir ayarla olmaz; birbirini tamamlayan katmanlarla olur. Kod katmanı açığı kökten kapatır, diğerleri kaçan bir hatanın etkisini azaltır.
Hazırlanmış ifadeler. Sorgunun kalıbı önce veritabanına gönderilir, kullanıcı verisi ayrı bir parametre olarak eklenir. Veritabanı bu parametreyi ne içerirse içersin komut olarak değil, veri olarak işler. PHP’de bu yöntem PDO ve MySQLi ile doğrudan desteklenir; PHP dokümantasyonundaki hazırlanmış ifadeler bölümü kalıbı gösteriyor. Örneğin SELECT * FROM uyeler WHERE eposta = ? biçimindeki sorguda soru işaretinin yerine gelen değer hiçbir koşulda sorgunun yapısını değiştiremez.
Güncel yazılım. WordPress çekirdeğini, eklentileri ve temaları güncel tutmak, bilinen açıklara yayımlanan yamaları uygular. Kullanmadığınız eklentiyi pasif bırakmak yetmez; sunucuda duran kod hâlâ çağrılabilir, silmek gerekir.
En az yetkili veritabanı kullanıcısı. Sitenin bağlandığı veritabanı kullanıcısı yalnız kendi veritabanına ve yalnız gereken işlemlere yetkili olmalıdır. cPanel’de veritabanı ve kullanıcı oluştururken yetkilerin nasıl seçildiği cPanel MySQL veritabanı kurulum kartında anlatılıyor.
Web uygulaması güvenlik duvarı. WAF, isteklerdeki bilinen saldırı kalıplarını sunucuya ulaşmadan durdurur. Yeni ya da gizlenmiş varyasyonları her zaman yakalayamaz; WAF gerekir mi yazısı hangi durumda ek bir katmanın gerçekten fark yarattığını tartışıyor.
Dikkat
Kullanıcı girdisinden tırnak işaretlerini silmek ya da kaçış fonksiyonuyla işaretlemek hazırlanmış ifadenin yerini tutmaz. Karakter seti farkları ve sayısal alanlar gibi durumlarda bu yöntemler aşılabilir. Kalıcı çözüm, veri ile sorguyu yapısal olarak ayırmaktır.
Sitenizde Açık Olup Olmadığını Nasıl Anlarsınız
Kendi sitenize saldırı denemesi yapmak yerine önce envanter çıkarın. Hangi eklentiler yüklü, en son ne zaman güncellenmiş, hangisinin geliştiricisi hâlâ aktif? Özel yazılmış kod varsa geliştiricinize veritabanı sorgularında hazırlanmış ifade kullanıp kullanmadığını doğrudan sorun. Sunucu erişim kayıtlarında arama ya da filtre parametrelerine gelen, SQL anahtar kelimeleri içeren tekrar eden istekler de bir işarettir.
Belirti gördüyseniz ya da açık istismar edildiyse temizlik ayrı bir iştir: açığı kapatmak, eklenen hesapları silmek, parolaları sıfırlamak ve gerekirse temiz yedekten dönmek. Bu sıranın tamamı site hacklenirse ne yapmalı rehberinde var.
Hosting Seçimi Bu Riske Ne Katar
Hosting sağlayıcısı sitenizin kodundaki açığı kapatamaz; bu, geliştiricinin ve site sahibinin sorumluluğudur. Sağlayıcının katkısı etrafındaki katmandadır: hesapların birbirinden yalıtılması, güncel PHP sürümlerinin sunulması, sunucu düzeyinde güvenlik yazılımı ve geri dönülebilir yedek. Paylaşımlı hostingte bu katmanı sağlayıcı yönetir. VPS’te ise web sunucusu, veritabanı sunucusu ve güvenlik duvarı ayarları sizin elinizdedir. Sağlayıcı ve site sahibi arasındaki bu iş bölümünün bütün resmi web sitesi güvenliği önlemleri yazısında duruyor.
Sonuç
SQL injection nedir sorusunun pratik karşılığı: veriyle komutu karıştıran kodun bedelidir. Hazırlanmış ifadeler açığı kökten kapatır, güncel eklentiler bilinen açıkları temizler, en az yetkili veritabanı kullanıcısı ve WAF ise kaçan bir hatanın etkisini küçültür. Dört katmandan ilk ikisi olmadan diğerleri yalnızca zaman kazandırır.
Kontrol Listesi, Veritabanı Güvenliği
- Yüklü eklenti ve temaları listeleyin, son güncelleme tarihi bir yılı geçenleri değiştirin.
- Kullanmadığınız eklenti ve temaları pasif bırakmak yerine silin.
- Özel kod yazdırdıysanız geliştiriciden hazırlanmış ifade kullandığının yazılı teyidini alın.
- Sitenin veritabanı kullanıcısının yalnız kendi veritabanına yetkili olduğunu kontrol edin.
- Veritabanı yönetici parolasını site parolasından farklı ve uzun tutun.
- Veritabanı yedeğini düzenli indirin ve bir kez geri yüklemeyi deneyin.
- PHP sürümünü desteklenen bir sürümde tutun.
Sıkça sorulan sorular
SQL injection nedir, sadece büyük siteler mi hedef olur?
Hayır. Saldırıların büyük kısmı otomatik tarayıcılarla yapılır; bu araçlar siteyi büyüklüğüne göre değil, açık barındırıp barındırmadığına göre seçer. Bilinen bir eklenti açığı yayımlandığında o eklentiyi kullanan binlerce küçük site aynı gün taranır. Az ziyaretçisi olan bir kurumsal site de, iletişim formu olan bir blog da aynı riski taşır.
WordPress kullanıyorsam SQL injection riskim var mı?
WordPress çekirdeği veritabanı erişiminde hazırlanmış sorgu mekanizması sunar ve düzenli güvenlik güncellemesi alır. Risk çoğunlukla eklenti ve temalardan gelir, özellikle bu mekanizmayı kullanmayan ya da bakımı bırakılmış olanlardan. Az sayıda, aktif geliştirilen eklenti kullanmak ve otomatik güncellemeleri açmak riskin büyük bölümünü azaltır.
Güvenlik eklentisi SQL injection açığını kapatır mı?
Kapatmaz, ama bazı saldırı denemelerini engelleyebilir. Güvenlik eklentileri ve güvenlik duvarları istekleri bilinen kalıplara göre süzer. Açık kodun içinde durduğu sürece farklı bir istek biçimiyle istismar edilebilir. Eklenti ek bir katmandır; kalıcı çözüm açığı içeren eklentiyi güncellemek ya da kaldırmaktır.
Açık istismar edildiyse ilk ne yapılmalı?
Önce açığı barındıran bileşeni devre dışı bırakın ya da güncelleyin. Ardından yönetici hesaplarını kontrol edip tanımadıklarınızı silin, tüm yönetici ve veritabanı parolalarını değiştirin. Veri değiştirildiyse temiz bir yedekten dönün. Müşteri verisi okunmuş olabilirse kişisel veri ihlali açısından durumu hukuk danışmanınızla değerlendirin.
SQL injection ile XSS aynı şey mi?
Değil. SQL injection sunucu tarafında veritabanı sorgusunu hedef alır ve veriyi okumaya ya da değiştirmeye yöneliktir. XSS ise ziyaretçinin tarayıcısında çalışan betik enjeksiyonudur ve oturum bilgisi çalmaya ya da sayfayı değiştirmeye yöneliktir. Kökleri benzerdir; ikisinde de kullanıcı verisine gereğinden fazla güvenilmiştir.
Narhost’ta
Web hosting paketlerimizde PHP 5.6 ile 8.4 arasında sürüm seçimi, cPanel’den yetkisi ayarlanabilir MySQL kullanıcıları ve haftalık yedekleme bulunur.