Ana içeriğe atla

SQL Enjeksiyonu: Nasıl Çalışır ve Nasıl Önlenir

SQL enjeksiyonunu, nasıl çalıştığını ve sisteminizi kötü amaçlı saldırılardan nasıl koruyacağınızı öğrenin.
Güncel 22 Nis 2026  · 8 dk. oku

SQL enjeksiyonu (kısaca SQLi), hacker el kitabının en eski numaralarından biridir; buna rağmen hâlâ son derece yaygın ve tehlikelidir. Kısacası, bir veritabanını yapmaması gereken şeyleri ortaya dökmeye kandırmaktır.

Bu yazıda, SQL enjeksiyonunun gerçekte ne olduğunu, saldırganların bunu hangi yollarla kullandığını, ciddi hasara yol açan gerçek örnekleri ve belki de en önemlisi, nasıl önleyebileceğinizi anlatacağım. İster geliştirici olun ister internette işler nasıl bozuluyor merak edin, yazıyı bitirdiğinizde SQLi’yi sağlam bir şekilde anlamış olacaksınız (yarısında uykunuz gelmeden, söz).

SQL Enjeksiyonu Nedir? 

SQL enjeksiyonu, birinin uygulamanızın veritabanına gönderdiği SQL sorgularını kurcalamanın bir yolunu bulmasıyla gerçekleşen bir saldırı türüdür. Normalde bu sorgular, bir kullanıcının profilini getirmek veya bir ürün listesini güncellemek gibi işler yapar. Ancak SQLi ile bir saldırgan, arama çubukları veya oturum açma formları gibi giriş alanlarına kötü amaçlı SQL kod parçaları enjekte eder ve bir anda veritabanı tam da onların istediğini yapmaya başlar.

Bu neden işe yarar? 

Çünkü bir noktada uygulama, kullanıcı girdisine gereğinden fazla güvenip onu zararsız metin gibi, potansiyel olarak çalıştırılabilir kod gibi değilmiş gibi ele alır. Bu, birine bir form doldurtup sonra yazdıklarını doğrudan komut satırına yapıştırmak gibidir.

Neden kötüdür?

SQL enjeksiyonu tehlikelidir çünkü özel verileri (kullanıcı adları, parolalar veya kredi kartı bilgileri gibi) görüntülemek veya çalmak, oturum açma ekranlarını atlamak, verileri silmek ya da değiştirmek ve en kötü senaryoda veritabanı sunucusunun tamamını ele geçirmek için kullanılabilir.

Yani evet, SQLi kötüdür ve yeni bir güvenlik endişesi bile değildir; ancak buna karşı düzgün şekilde korunmayan uygulama sayısına şaşırabilirsiniz.

SQL Enjeksiyonu Türleri

Saldırganın uygulamanızla nasıl etkileşime geçtiğine ve ne tür geri bildirim aldığına bağlı olarak SQLi birkaç farklı çeşide ayrılır. Karşılaşabileceğiniz 3 ana tür vardır:

In-band SQLi

Bu en yalın türdür. Saldırgan kötü amaçlı bir SQL sorgusu gönderir ve sonuçları uygulama üzerinden doğrudan geri alır. Hızlıdır ve çoğunlukla çok etkilidir.

  • Hata tabanlı SQLi: Bu teknik, veritabanının faydalı hata mesajları döndürmesine dayanır. Bu hatalar, tablo adları veya sorgu yapısı gibi bir sürü yararlı bilgiyi açığa çıkarabilir ve saldırganın bir sonraki hamlesini planlamasını kolaylaştırır.

  • Union tabanlı SQLi: Burada saldırgan, UNION operatörünü kullanarak kendi sorgusunu uygulamanızın çalıştırdığı sorguyla birleştirir. Bu, veritabanından fazladan verileri çekip yanıta sızdırmanın akıllıca bir yoludur.

Çıkarımsal SQLi (nam-ı diğer Kör SQLi)

Bu daha sinsidir. Saldırgan, sorgusunun sonuçlarını doğrudan görmek yerine, uygulamanın davranışını izleyerek perde arkasında neler olduğunu anlamaya çalışır.

  • Boole tabanlı (içerik tabanlı) SQLi: Saldırgan, doğru ya da yanlış olan koşullarla (ör. 1=1 veya 1=2) sorguyu değiştirir ve sayfanın nasıl değiştiğini gözlemler. Normal mi yükleniyor? Hata mı veriyor? Garip mi davranıyor?
  • Zaman tabanlı SQLi: Bu teknik, sorguya zaman gecikmeleri ekler (ör. WAITFOR DELAY '00:00:05') ve yanıt süresini, bir koşulun doğru olup olmadığını çıkarmak için kullanır.

Out-of-band SQLi (işler biraz havalılaştığında)

Bu daha az yaygındır ama bilinmeye değerdir. Out-of-band SQLi, uygulamadan anlık yanıt almaya dayanmaz. Bunun yerine saldırgan, verileri çıkarmak için DNS veya HTTP istekleri gibi alternatif kanalları kullanır. Genellikle doğrudan geri bildirim almanın mümkün olmadığı, ancak veritabanı sunucusunun internet erişimi bulunduğu durumlarda kullanılır (ve vakaların %90’ında bulunmamalıdır).

Yaygın SQL Enjeksiyonu Teknikleri

Tamam, 3 tür SQL enjeksiyonunu öğrendik. Peki saldırganlar bunu pratikte nasıl başarıyor?

OR 1=1 saldırısı

Bu klasik bir örnektir. Kullanıcı adı ve parola girmeniz gereken bir oturum açma formu düşünün. Bir saldırgan şuna benzer bir şey girebilir:

' OR 1=1 --

SQL sorgusu şu şekilde görünür:

SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';

1=1 her zaman doğru olduğundan, veritabanı tüm kullanıcıları döndürür ve --, sorgunun geri kalanını yorum satırına çevirir. Bir sınır yoksa, saldırgan geçerli bir kullanıcı adı bile bilmeden oturum açabilir.

' OR 1=1 attack

Kaynak: vmware

Yorum enjeksiyonu

Yukarıda görüldüğü gibi, -- veya /* */ karakterleri, bir SQL ifadesinin bölümlerini yorum satırına almak için kullanılır. Saldırganlar bunu, enjekte ettikleri yükü bozabilecek ek yan tümceleri kaldırmak için kullanır. Örneğin, orijinal sorgunun tam yapısını bilmiyorlarsa, onu kesip tekrar sözdizimsel olarak geçerli hale getirebilirler.

Toplu SQL ifadeleri

Bazı veritabanları, noktalı virgülle ayrılmış tek bir istekte birden fazla SQL ifadesinin çalıştırılmasına izin verir. Bu özellik, uygulama bunu kısıtlamıyorsa, verileri değiştirmekten tabloları düşürmeye kadar her türden hasarı vermek için kötüye kullanılabilir.

'; DROP TABLE users; --

UNION tabanlı saldırılar

Bir UNION SELECT ifadesi enjekte ederek saldırganlar, kötü amaçlı sorgularını meşru sorguyla birleştirip hassas kullanıcı verileri, parolalar veya kredi kartı bilgileri gibi diğer tablolardan sonuçlar getirebilir. Esasen mevcut bir sorguyu kullanarak ekstradan veri çekmektir.

Kör SQL enjeksiyonu

Bunu daha önce anmıştık. Uygulama hata göstermediğinde veya sorgu sonuçlarını döndürmediğinde bile, saldırganlar davranışı gözlemleyerek verileri parça parça çıkarabilir. Daha yavaş ve zahmetlidir ama işe yarar. Bu genellikle yüzlerce sorgu ve zaman tabanlı yanıt deneyebilen araçlarla otomatikleştirilir.

Saklı SQL enjeksiyonu

Kötü amaçlı SQL, bir kullanıcı profili veya yorum gibi veritabanına kaydedilir ve o veri görüntülendiğinde daha sonra çalıştırılır.

Gerçek Dünyadan SQL Enjeksiyonu Saldırıları

SQL enjeksiyonu kulağa niş hacker işiyormuş gibi gelebilir, ama yıllar içinde çok gerçek hasarlara yol açtı. Hasar derken, milyonlarca kullanıcı kaydının açığa çıkmasını, büyük cezaları ve pazarlama ekiplerinin hiç de hoşlanmadığı manşetleri kastediyorum.

Guess.com (2002)

İnsanların dikkat kesilmesine yol açan erken bir örnektir. Bir güvenlik araştırmacısı, bir SQL enjeksiyonu açığını istismar ederek kredi kartı bilgileri dahil 200.000’den fazla müşteri kaydına erişti. İyi haber, bunu bulan ve bildirenin etik bir hacker olmasıydı. 

Heartland Payment Systems (2009)

Bir ödeme işlemcisini etkileyen devasa bir ihlaldi ve 130 milyondan fazla kredi kartı numarası çalındı. Saldırganlar, ilk erişimi sağlamak için SQL enjeksiyonunu kullandı ve oradan yükselttiler. Bu olay, en büyük veri ihlallerinden biri olarak sıkça anılır.

Yahoo! Voices (2012)

Saldırganlar, UNION tabanlı bir SQL enjeksiyonu açığını istismar ederek 450.000 kullanıcı adı ve düz metin parolayı ifşa etti. Evet, doğru okudunuz; düpedüz düz metin kimlik bilgileri orada duruyordu. Bu ihlal özellikle utanç vericiydi çünkü Yahoo! büyük bir teknoloji şirketiydi ve şifreleri şifrelenmemiş saklamak 2012 standartlarına göre bile ciddi bir “yapılmaması gereken”di.

TalkTalk (2015)

TalkTalk, oldukça temel bir SQL enjeksiyonu saldırısının kurbanı olan, Birleşik Krallık’ta yüksek profilli bir telekom sağlayıcısıydı. Yaklaşık 157.000 müşteri kaydı ele geçirildi ve şirkete 400.000 £ para cezası kesildi. Saldırganlardan biri yalnızca 17 yaşındaydı.

Gab (2021)

Hacktivistler, 70 GB veri (özel gönderiler ve karma parolalar dahil) dışarı sızdırmak için SQL enjeksiyonunu kullandı. İhlal siyasi açıdan yüklüydü ve sonuçları, Gab’in genel güvenlik duruşunun daha da mercek altına alınmasına yol açtı.

SQL Enjeksiyonu Nasıl Önlenir

Tamam, tüm bu gerçek ihlallerle kendimizi biraz korkuttuğumuza göre, çözümlerden bahsedelim. İyi haber şu ki SQL enjeksiyonunu önlemek roket bilimi değil. Çoğu zaman mesele, kullanıcı girdisine güvenmemek ve en iyi uygulamalara sadık kalmaktır. Yapabilecekleriniz şunlar:

Parametreli sorgular kullanın

Bir numaralı kural budur. Asla SQL sorgularını string birleştirerek oluşturmayın. Bunun yerine yer tutucular kullanın ve kullanıcı girdilerini parametre olarak gönderin. Çoğu çatı ve kütüphane bunu son derece kolaylaştırır.

Örneğin Node.js’te pg (PostgreSQL) ile:

client.query('SELECT * FROM users WHERE id = $1', [userId]);

Bu, veritabanına özünde şunu söyler: “İşte sorgu yapısı ve işte bazı veriler; lütfen bunları birbirine karıştırmayın.”

Saklı yordamları akıllıca kullanın

Saklı yordamlar yardımcı olabilir, ancak yalnızca dinamik SQL’den de kaçınıyorlarsa. Fikir şu: SQL mantığı veritabanında yaşar ve uygulamanız bu güvenli, önceden tanımlanmış mantık parçalarını çağırır.

Fonksiyonlar ve saklı yordamlar oluşturmayı, güncellemeyi ve yürütmeyi öğrenmek istiyorsanız, SQL Server’da Fonksiyonlar ve Saklı Yordamlar Yazma kursumuza göz atın.

Girdileri doğrulayın ve temizleyin

Uygulamanız bir sayı bekliyorsa, bunun gerçekten bir sayı olduğundan emin olun. Kullanıcının size gönderdiği her şeyi körü körüne kabul etmeyin. Tür kontrolleri, uzunluk sınırları ve mümkün olduğunda izin listeleri (ör. yalnızca bilinen geçerli değerleri kabul etmek) kullanın.

Karakter kaçışları (tırnaklar gibi) da yardımcı olabilir, ancak parametreli sorguların yerini tutmaz.

Web Uygulama Güvenlik Duvarı (WAF) kullanın

Bir WAF, özellikle bilinen saldırı kalıplarına karşı ilk savunma hattı olabilir. Kötü amaçlı trafiğin bir kısmını uygulamanıza ulaşmadan engellemeye yardımcı olabilir. Kusursuz değildir ama işe yarar; SQL’iniz için bir tür spam filtresi gibidir.

Asgari ayrıcalık ilkesini uygulayın

Web uygulamanızın veritabanına yönetici haklarıyla bağlanmaması gerekir. Her kullanıcının veya servisin neler yapabileceğini sınırlayın. Örneğin, uygulamanız yalnızca veri okuması gerekiyorsa, ona tablo silme izni vermeyin. Ne kadar az yetkisi olursa, bir enjeksiyon o kadar az zarar verebilir.

SQL Enjeksiyonu Testi ve Tespiti

Kodunuzun güvenli olduğunu düşünseniz bile, onu bir saldırgan gibi test etmeye değer. SQL enjeksiyonu, özellikle büyük kod tabanlarında veya eski sistemlerde, aralardan sızmanın bir yolunu bulur. Tespiti çok daha kolaylaştıran ve kullanması da epey eğlenceli olan araç ve teknikler vardır.

Manuel test

Bazen bir açığı fark etmenin en hızlı yolu, onu dürtmektir. Form alanlarına, URL’lere veya diğer giriş alanlarına ' OR 1=1 -- veya '; DROP TABLE users; -- girmeyi deneyin ve uygulamanın nasıl tepki verdiğine bakın. Garip hatalar, beklenmedik veriler veya esrarengiz başarı mesajları alıyorsanız, şüpheli bir şey bulmuş olabilirsiniz.

İpucu: Her zaman geliştirme veya hazırlık ortamında test edin. 

Otomatik tarayıcılar

Sizin yerinize dürtecek çok sayıda araç var. İyilerden bazıları:

  • sqlmap: Tespiti ve istismarı otomatikleştiren açık kaynaklı bir canavar (etik test bağlamlarında).
  • Burp Suite: Genel olarak web uygulaması güvenliği için harikadır; SQLi tespiti için eklentileri vardır.
  • OWASP ZAP: Ücretsiz ve yeni başlayan dostu; her türlü web açığını bulmak için geliştirilmiştir.

Bu araçlar saldırıları simüle eder, olası enjeksiyon noktalarını işaretler ve bazen düzeltme önerileri de sunabilir.

Günlük analizi

Başka bir sinsi yöntem: veritabanı günlüklerinizi izleyin. Tekrarlanan başarısız sorgular, tuhaf sözdizimi kalıpları veya ', --, veya UNION SELECT içeren isteklerde artış kırmızı bayraklardır.

Sonuç

SQL enjeksiyonu yakın zamanda bir yere gitmiyor ve asla eskimeyen tehditlerden biridir. Basit, güçlü ve dikkatli olmazsanız ciddi hasara yol açabilir. İşin aslı, SQLi tamamen önlenebilir. Parametreli sorgular kullanarak, girdileri doğrulayarak, asgari ayrıcalık ilkesini uygulayarak ve düzenli testler yaparak uygulamalarınızı ve kullanıcılarınızı bir SQL enjeksiyonu saldırısının yıkıcı etkilerinden koruyabilirsiniz. 

Unutmayın, kimseden mükemmellik beklenmez; ancak biraz proaktif çabayla veritabanınızı güvende tutabilir ve bunu güvenlik kontrol listenizden çıkarabilirsiniz. SQL konusunda ciddiseniz ve becerilerinizi potansiyel işverenlere göstermek istiyorsanız, SQL Associate Certification’ımıza göz atın! Bu sertifika, bir veritabanından uygun verileri SQL kullanarak çıkarabildiğinizi ve bunları yaygın veri sorularını yanıtlamak için kullanabildiğinizi gösterecektir.


Marie Fayard's photo
Author
Marie Fayard

İlk prototipten ürün-pazar uyumuna ve ötesine kadar erken aşama girişimleri büyütme konusunda uzmanlaşmış, ürün odaklı bir teknik liderim. İnsanların teknolojiyi nasıl kullandığına dair bitmeyen bir merakım var ve kurucularla ile disiplinler arası ekiplerle yakın çalışarak cesur fikirleri hayata geçirmeyi seviyorum. Ürün inşa etmediğim zamanlarda ya dünyanın yeni köşelerinde ilham peşinde koşuyor ya da yoga stüdyosunda stres atıyorum.

SSS

SQL enjeksiyonu NoSQL veritabanlarına saldırmak için kullanılabilir mi?

Geleneksel SQL enjeksiyonu MongoDB gibi NoSQL veritabanlarında çalışmaz, ancak girdiler düzgün şekilde temizlenmezse benzer enjeksiyon tarzı saldırılar (doküman enjeksiyonları veya sorgu manipülasyonu gibi) meydana gelebilir.

Modern çatılar SQL enjeksiyonunu önlemeye nasıl yardımcı olur?

Birçok modern çatı (Django, Laravel veya Spring gibi), ORM katmanları ve otomatik parametrelendirme gibi yerleşik korumalar içerir; bu da kazara güvenlik açığı olan sorgular yazmayı zorlaştırır. Ancak yine de bunları doğru kullanmanız gerekir!

Mobil uygulamalar da SQL enjeksiyonuna karşı risk altında mı?

Kesinlikle. Bir mobil uygulama, kullanıcı girdisine dayalı olarak güvensiz SQL sorguları oluşturan bir arka uç API’siyle iletişim kuruyorsa, ön yüz kilitli görünse bile aynı derecede savunmasızdır.

Saldırganlar SQL enjeksiyonuyla hedef alabilecekleri savunmasız web sitelerini nasıl bulur?

Genellikle otomatik tarayıcılar veya “Google dorking” (özel arama sorguları) kullanarak, girdi alanları veya sömürülebilir URL parametreleri olan sayfaları bulurlar.

Konular

DataCamp ile öğrenin

Kurs

SQL’e Giriş

2 sa
1.5M
Sadece iki saat içinde SQL kullanarak ilişkisel veritabanlarını nasıl oluşturacağınızı ve sorgulayacağınızı öğrenin.
Ayrıntıları GörRight Arrow
Kursa Başla
Devamını GörRight Arrow