SQL injection nedir ve nasıl önlenir?
Cevap
SQL injection, kullanıcı girdisinin doğrudan SQL metnine eklenmesiyle saldırganın sorgunun yapısını değiştirebilmesidir.
// YANLIŞ: string birleştirme
const sql = `SELECT * FROM users WHERE email = '${email}'`;
// email = "' OR '1'='1" girilirse tüm kullanıcılar dönerGirdi, sorgunun bir parçası değil veri olarak gönderilmelidir:
// DOĞRU: parametreli sorgu (prepared statement)
const { rows } = await pool.query(
"SELECT * FROM users WHERE email = $1",
[email]
);Savunma katmanları
- Parametreli sorgu / prepared statement: asıl çözüm budur. Veritabanı sürücüsü değeri sorgudan ayrı gönderir.
- ORM / query builder: (Prisma, Sequelize, SQLAlchemy) varsayılan olarak parametre kullanır; ancak
rawsorgularda yine dikkat gerekir. - En az yetki: uygulamanın DB kullanıcısı
DROPveya başka şemalara erişim yetkisine sahip olmamalı. - Beyaz liste: tablo/kolon adı veya
ORDER BYalanı gibi parametrelenemeyen kısımlar izin verilen değerler listesinden seçilmeli. - Girdi doğrulama ve hata mesajlarında sorgu detayı göstermemek ek katmandır, tek başına yeterli değildir.
"Tırnakları escape ederim" cevabı zayıftır; mülakatta parametreli sorguyu öne çıkarın.
İlgili Web Güvenliği soruları
- CORS nedir? Neden CORS hatası alırız?
- XSS ve CSRF saldırıları nedir, nasıl korunulur?
- Authentication ile authorization arasındaki fark nedir?
- Güvenli cookie ayarları nelerdir? Session hijacking nasıl önlenir?
- Content Security Policy (CSP) nedir ve nasıl yapılandırılır?
- OWASP Top 10 nedir? En önemli maddelerini özetleyin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.