← Blog
Guvenlik8 dk okumaMegis

SQL Injection Korunma: Veritabani Guvenlik Rehberi

SQL injection saldirilarini onleyerek veritabaninizi ve kullanici verilerini guvende tutun.

SQL Injection Nedir ve Neden Bu Kadar Tehlikelidir?

SQL Injection (SQLi), web uygulamalarinda en yaygin ve en yikici guvenlik acikliklari arasinda yer alir. OWASP Top 10 listesinde yillarca birinci sirada kalan bu saldiri turu, kullanici girdisinin dogrudan SQL sorgularina eklenmesiyle ortaya cikar. Saldirgan, ozel olarak hazirlanmis girdiler kullanarak veritabanindaki tum verileri okuyabilir, degistirebilir, silebilir ve hatta sunucu uzerinde isletim sistemi komutlari calistirabilir.

2026 yilinda hala bircok web uygulamasi SQL Injection saldirilarinia karsi savunmasizdir. Ozellikle eski kod tabanlari, yeterli guvenlik bilincine sahip olmayan gelistiriciler tarafindan yazilmis uygulamalar ve hizli prototipleme sureclerinde guvenlik adimlarinin atlanmasi bu durumun baslica nedenleridir. Bu rehberde SQL Injection saldiri turlerini, korunma yontemlerini ve pratik uygulamalari kapsamli sekilde ele alacagiz.

SQL Injection Saldiri Turleri

SQL Injection saldirilari farkli kategorilere ayrilir. Her birinin calisme prensibi ve tehlike duzeyi farklidir:

1. Klasik (In-Band) SQL Injection

En yaygin SQL Injection turudur. Saldirgan, sonuclari dogrudan uygulama uzerinden gorebilir. Iki alt kategorisi vardir:

  • Union-Based SQLi: Saldirgan, UNION SQL operatorunu kullanarak ek sorgular ekler ve baska tablolardaki verileri mevcut sorgu sonuclarina ekler. Ornegin bir urun arama sorgusuna UNION SELECT ile kullanici tablosundaki sifreleri cekebilir.
  • Error-Based SQLi: Veritabani hata mesajlari uzerinden bilgi elde edilir. Saldirgan, kasitli olarak hatali sorgular gondererek veritabani yapisini, tablo ve sutun isimlerini ogrenebilir.

2. Blind SQL Injection

Uygulama, veritabani hatalarini veya sorgu sonuclarini dogrudan gostermiyorsa, saldirgan yanit farkliliklarindan yararlanir:

  • Boolean-Based Blind SQLi: Saldirgan, dogru veya yanlis sonuc ureten sorgular gondererek uygulamanin farkli davranislarindan bilgi cikarir. Ornegin "sayfa yukleniyorsa kosul dogru, yuklennemiyorsa yanlis" mantigi ile karakter karakter veri ceker.
  • Time-Based Blind SQLi: Saldirgan, SLEEP() veya WAITFOR DELAY gibi fonksiyonlarla yanit suresini olcer. Eger yanit belirli bir sure gecikiyorsa kosulun dogru oldugunu anlar.

3. Out-of-Band SQL Injection

Saldirgan, veritabani sunucusunun dis bir sunucuya veri gondermesini saglar. DNS veya HTTP istekleri uzerinden veri sizdirilir. Bu yontem, in-band ve blind tekniklerin isllemedigi durumlarda kullanilir ve veritabani sunucusunun dis baglanti yapabilmesini gerektirir.

4. Second-Order SQL Injection

Zararli girdi ilk asaamada guvenli bir sekilde saklanir, ancak daha sonra baska bir sorgu icinde kullanilirken tetiklenir. Ornegin kayit sirasinda kullanici adi olarak zararli bir deger girilir; bu deger sonradan profil guncelleme sorgusunda kullanildiginda saldiri gerceklesir.

Parametreli Sorgular (Prepared Statements)

SQL Injection'a karsi en etkili savunma yontemi parametreli sorgulardir. Bu yaklasimda SQL sorgu yapisi ile kullanici girdisi birbirinden ayrilir. Veritabani motoru, girdiyi her zaman veri olarak degerlendirir, asla calistirilabilir kod olarak yorumlamaz.

Guvenli olmayan sorgu ornegi (Node.js):

// TEHLIKELI - Asla boyle yapmayin!
const query = "SELECT * FROM users WHERE email = '" + userInput + "'";
db.query(query);

// Saldirgan su girdiyi kullanabilir:
// ' OR '1'='1' --
// Bu durumda tum kullanicilar dondurulur

Guvenli parametreli sorgu ornegi:

// GUVENLI - Parametreli sorgu
const query = "SELECT * FROM users WHERE email = ?";
db.query(query, [userInput]);

// PostgreSQL icin:
const query = "SELECT * FROM users WHERE email = $1";
db.query(query, [userInput]);

Parametreli sorgularda kullanici girdisi, sorgu yapisinin bir parcasi olarak degil, ayri bir parametre olarak gonderilir. Bu sayede saldirganin girdiyi SQL komutu olarak calistirmasi mumkun degildir.

ORM Kullanimi ile Korunma

Modern ORM (Object-Relational Mapping) kutuphaneleri, veritabani islemlerini soyutlayarak SQL Injection riskini buyuk olcude azaltir. Populer ORM secenekleri ve guvenlik ozellikleri:

Prisma

Prisma, TypeScript ekosisteminde en populer ORM'dir. Tum sorgular varsayilan olarak parametrelidir. Tip guvenligi sayesinde hatali sorgulari derleme zamaninda yakalar.

// Prisma ile guvenli sorgu
const user = await prisma.user.findUnique({
  where: { email: userInput }
});

// Prisma, bu sorguyu otomatik olarak
// parametreli hale getirir

Drizzle ORM

Drizzle, SQL-benzeri soz dizimiyle tip guvenli sorgular olusturmanizi saglar. Hafif yapisi ve performansi ile one cikar.

// Drizzle ile guvenli sorgu
const result = await db
  .select()
  .from(users)
  .where(eq(users.email, userInput));

TypeORM ve Sequelize

Her iki ORM de parametreli sorgular kullanir. Ancak raw query kullaniminaa dikkat edilmelidir; raw sorgularda parametreleri elle gecirmeniz gerekir.

// TypeORM - Raw sorgu GUVENLI kullanim
const users = await dataSource.query(
  "SELECT * FROM users WHERE email = $1",
  [userInput]
);

// TEHLIKELI - Raw sorgu string birlestirme
const users = await dataSource.query(
  `SELECT * FROM users WHERE email = '${userInput}'`
);

ORM kullaniyor olsaniz bile, raw SQL yazdiginiz her yerde parametreli sorgularin kullanildigindaan emin olun. ORM'lerin sundugu query builder yontemlerini tercih edin.

Girdi Dogrulama ve Temizleme

Parametreli sorgularin yaninda girdi dogrulama, derinlemesine savunma (defense in depth) stratejisinin onemli bir parcasidir:

  • Beyaz liste (whitelist) yaklasimi: Kabul edilen degerleri tanimlaayin. Ornegin siralama parametresi yalnizca "name", "date", "price" degerlerini kabul etsin.
  • Tip dogrulamasi: Sayisal bir alan icin yalnizca sayi kabul edin. Zod, Yup veya Joi gibi dogrulama kutuphaneleri kullanin.
  • Uzunluk sinirlamasi: Her girdi icin makul bir uzunluk siniri belirleyin. 50 karakterlik bir kullanici adi alani, binlerce karakterlik girdiyi reddetmelidir.
  • Ozel karakter kontrolu: Tek tirnak, cift tirnak, noktali virgul, tire gibi SQL meta karakterlerini filtrelleyin veya kacis uygulaayin. Ancak bu yonteme tek basina guvenmeyin; parametreli sorgularla birlikte kullanin.
// Zod ile girdi dogrulama ornegi
import { z } from 'zod';

const loginSchema = z.object({
  email: z.string().email().max(255),
  password: z.string().min(8).max(128),
});

// Girdiyi dogrula
const validated = loginSchema.parse(req.body);
// Simdi guvenle kullanabilirsiniz

WAF (Web Application Firewall) Kullanimi

Web Application Firewall, uygulama katmaninda caalisan ve zararli istekleri filtreleyen bir guvenlik katmanidir. SQL Injection saldirilarini tespit etmek ve engellemek icin kural tabanlii ve makine ogrenimi tabanli yontemler kullanir.

Populer WAF Cozumleri

  • Cloudflare WAF: Kolay kurulum, otomatik kural guncellemeleri ve OWASP kurallarini icerir. Ucretsiz planla bile temel koruma saglar.
  • AWS WAF: AWS altyapisinda caalisan uygulamalar icin idealdir. Ozel kurallar yazabilir ve CloudFront ile entegre edebilirsiniz.
  • ModSecurity: Acik kaynakli WAF motoru. Apache, Nginx ve IIS ile calisir. OWASP Core Rule Set (CRS) ile genis kapsamli koruma saglar.
  • Vercel Firewall: Next.js uygulamalari icin entegre guvenlik. Edge uzerinde calisan kurallarla SQL Injection saldirilarini engeller.

WAF, derinlemesine savunma stratejisinin bir parcasidir. Tek basina yeterli degildir; parametreli sorgular ve girdi dogrulama ile birlikte kullanilmalidir. WAF kurallari, false-positive (yanlis alarm) uretebilir; bu nedenle uygulamanizin normal isleyisini etkilemedigindan emin olmak icin monitor modunda test edin.

En Az Yetki Prensibi (Principle of Least Privilege)

Veritabani kullanicisina yalnizca ihtiyac duydugu yetkileri verin. Uygulama kullanicisi asla DROP, ALTER veya CREATE yetkilerine sahip olmamalidir. Her mikro servis veya modül icin ayri veritabani kullanicilari olusturun:

  • Okuma modulu: Yalnizca SELECT yetkisi
  • Yazma modulu: SELECT, INSERT, UPDATE yetkileri
  • Admin modulu: Sinirli tablolarda tam yetki, ancak yalnizca admin ag segmentinden erisim
-- PostgreSQL yetki ornegi
CREATE USER app_reader WITH PASSWORD 'guclu_parola';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_reader;

CREATE USER app_writer WITH PASSWORD 'guclu_parola2';
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_writer;

-- DROP ve DELETE yetkisi vermeyin!

Hata Mesajlarini Gizleme

Veritabani hata mesajlari, saldirgan icin degerli bilgi kaynagidir. Tablo isimleri, sutun isimleri, veritabani versiyonu ve sorgu yapisi gibi bilgiler hata mesajlarinda yer alabilir. Uretim ortaminda detayli hata mesajlarini asla kullaniciya gostermeyin:

  • Hatalari sunucu loglarinda kaydedin, kullaniciya genel bir hata mesaji gosterin.
  • Next.js uygulamalarinda NODE_ENV=production modunda detayli hata mesajlari otomatik olarak gizlenir.
  • API yanit kodlarinii uygun sekilde kullanin; 500 Internal Server Error donun, ancak detay eklemeyin.

SQL Injection Test Araclari

Uygulamanizi duzenli olarak SQL Injection aciklarina karsi test etmek kritik oneme sahiptir. Yaygin kullanilan araclar:

  • SQLMap: Acik kaynakli otomatik SQL Injection tespit ve istismar araci. Veritabaani turunu otomatik olarak algilar ve cesitli saldiri tekniklerini dener.
  • Burp Suite: Web uygulama guvenlik testi icin kapsamli bir platform. SQL Injection dahil bircok saldiri turunu otomatik olarak tarar.
  • OWASP ZAP: Ucretsiz ve acik kaynakli web uygulama guvenlik tarayicisi. CI/CD pipeline'a entegre edilebilir.
  • Snyk: Kod analizi ile potansiyel SQL Injection noktalarini tespit eder. GitHub entegrasyonu ile pull request'lerde otomatik tarama yapar.

SQL Injection Korunma Kontrol Listesi

Uygulamanizi SQL Injection saldirilarinna karsi korumak icin su kontrol listesini takip edin:

  1. Tum veritabani sorgularinda parametreli sorgular veya ORM kullanin
  2. Raw SQL kullandiiginiz yerleri tespit edin ve parametreli hale getirin
  3. Girdi dogrulamayi Zod veya Joi ile uygulaayin
  4. Veritabani kullanicilarina en az yetki prensibini uygulaayin
  5. Uretim ortaminda veritabani hata mesajlarini gizleyin
  6. WAF yapilandirarak ek koruma katmani ekleyin
  7. Duzenli guvenlik taramalari yaparak aciklari proaktif olarak tespit edin
  8. Gelistirici ekibinize SQL Injection farkindalik egitimi verin
  9. Stored procedure kullanarak sorgu yapisini veritabani tarafinda tanimlaayin
  10. Veritabani aktivitelerini izleyin ve anomali tespiti yapin

Sonuc

SQL Injection, onlarca yildir bilinen ancak hala en yaygin guvenlik acikliklari arasinda yer alan ciddi bir tehdittir. Parametreli sorgular, ORM kullanimi, girdi dogrulama, WAF ve en az yetki prensibi gibi yontemlerin birlikte uygulanmasi, etkili bir savunma saglar. Guvenlik tek bir onlem degil, katmanli bir yaklasimdir. Uygulamanizin her katmaninda guvenlik onlemlerini uygulayin ve duzenli olarak test edin.

#sql injection#veritabani guvenlik#prepared statement#input sanitization