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öner

Girdi, 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 raw sorgularda yine dikkat gerekir.
  • En az yetki: uygulamanın DB kullanıcısı DROP veya başka şemalara erişim yetkisine sahip olmamalı.
  • Beyaz liste: tablo/kolon adı veya ORDER BY alanı 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.

  1. CORS nedir? Neden CORS hatası alırız?OrtaWeb GüvenliğiFull Stack
  2. XSS ve CSRF saldırıları nedir, nasıl korunulur?ZorWeb GüvenliğiFull Stack
  3. Authentication ile authorization arasındaki fark nedir?KolayWeb GüvenliğiFull Stack
  4. Güvenli cookie ayarları nelerdir? Session hijacking nasıl önlenir?OrtaWeb GüvenliğiFull Stack
  5. Content Security Policy (CSP) nedir ve nasıl yapılandırılır?ZorWeb GüvenliğiFull Stack
  6. OWASP Top 10 nedir? En önemli maddelerini özetleyin.OrtaWeb GüvenliğiFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle