İçeriğe atla
0 XP 0
0/4

Puan ders bitince hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

8 dk · 50 XP · 4 etkinlik

Parametreli sorgu

Girdiyi doğruladın, çıktıyı kodladın. Sorgu tarafında farklı bir tehlike var. Yaygın hata, kullanıcı verisini SQL metniyle aynı string içinde birleştirmektir. AltayKargo iade servisi takip numarasına göre kayıt ararken sorguyu metin birleştirmeyle kurabilir. Bu durumda saldırgan takip numarası alanına bir tırnak işareti ve ardından her zaman doğru olan bir koşul yazar. Sorgu bu koşulla tüm tabloyu döner, çünkü veritabanı hangi parçanın veri hangi parçanın komut olduğunu ayırt edemez. Bu saldırıya SQL enjeksiyonu denir ve yirmi yıldır en çok sömürülen açıklardan biridir, çünkü kurulumu kolay, etkisi büyüktür. SQL enjeksiyonu OWASP'ın en kritik risk listelerinde uzun yıllar ilk sıralarda yer aldı, çünkü kurulumu basit, veri kaybı büyük ve tespiti bazen aylar sonra mümkün oluyor.

Parametreli sorgu bu karışmayı kökten çözer. Sorgu şablonu önceden derlenir, yer tutucularla; veri ayrı bir parametre listesinde gönderilir. Sürücü veriyi asla sorgu metnine karıştırmaz, tırnak kaçırmaya da gerek kalmaz, çünkü veri hiç metne girmez. ORM ve sorgu oluşturucu kütüphaneler (Prisma, Sequelize, Knex gibi) bunu varsayılan olarak yapar; tehlike genelde ham SQL fonksiyonlarında elle string birleştirilince ortaya çıkar. Bu ayrım, saldırganın gönderdiği metnin ne kadar özenli yazıldığının önemini ortadan kaldırır.

const sorgu = `SELECT * FROM iadeler WHERE takip_no = '${takipNo}'`;
const sonuc = await db.raw(sorgu);
Önce: kullanıcı verisi sorgu metnine doğrudan birleştiriliyor.
const sonuc = await db.raw("SELECT * FROM iadeler WHERE takip_no = ?", [takipNo]);
Sonra: değer yer tutucuyla ayrı bir parametre olarak bağlanıyor.

Soru işareti yer tutucudur, takipNo ise ayrı bir dizide taşınan parametredir. Sürücü veriyi tip denetiminden geçirip bağlar, veri hiçbir zaman sorgu gövdesine karışmaz. Aynı ilke ORM'in yapılandırılmış sorgu fonksiyonları için de geçerlidir, çünkü onlar arka planda aynı parametreli sorguyu üretir. Bu davranış sürücünün kendi iç mantığında sabittir; geliştiricinin ayrıca bir kaçışlama fonksiyonu yazmasına gerek kalmaz. Örneğin takip numarası alanına bir tırnak ve ardından her zaman doğru bir koşul yazılsa bile, sürücü bunu tek bir metin değeri olarak arar ve eşleşen kayıt bulunamaz.