SQL injection: nedir ve nasıl düzeltilir

SQL injection, istekten gelen metin sorgunun kullandığı bir değer olmak yerine SQL ifadesinin kendisinin parçası olduğunda olur. Saldırgan veri vermeyi bırakır ve sorguyu yazmaya başlar.

Örnek

Zafiyetli
app.get("/users", async (req, res) => {
  const name = req.query.name;
  const rows = await db.query(
    "SELECT * FROM users WHERE name = '" + name + "'"
  );
  res.json(rows);
});
Güvenli
app.get("/users", async (req, res) => {
  const rows = await db.query(
    "SELECT * FROM users WHERE name = $1",
    [String(req.query.name)]
  );
  res.json(rows);
});

Nasıl oluşur

Veritabanı, string ile kurulmuş bir sorgunun hangi kısmını geliştiricinin yazdığını, hangi kısmının istekten geldiğini ayırt edemez. ' OR '1'='1 gibi bir ad, bir aramayı tüm satırların dökümüne çevirir; yorumla biten bir değer giriş sorgusundan parola kontrolünü kaldırır; art arda ifadeler veriyi değiştirebilir veya silebilir. ORM'ler bunun çoğunu önler, ta ki biri ham sorguya ya da şablon string'iyle kurulan bir WHERE ifadesine başvurana kadar.

Nasıl düzeltilir

Değerleri ifadeden ayrı gönder.

  • Yer tutucular ($1, ?, :name) kullan ve değerleri parametre olarak geçir
  • Araya değer eklenmiş ham SQL yerine sorgu oluşturucu veya ORM metotlarını kullan
  • Sayıları Number veya parseInt ile çevir ve kullanmadan önce aralığını kontrol et
  • Tablo veya kolon adlarını asla girdiden kurma; izin verilen adları açıkça eşle

RepoVerse bunu nasıl bulur

  • Yüksekİstek girdisi SQL sorgusunun içine yazılıyor

    Çağıran sorguyu yeniden yazabilir: başka kullanıcıların satırlarını okur, giriş kontrolünü atlar veya veriyi değiştirir.

    veri akışı · CWE-89

  • YüksekString birleştirmeyle kurulan SQL

    Sorgu parametre bağlanmak yerine değişkenlerden kuruluyor.

    örüntü

  • YüksekFormat veya birleştirmeyle üretilen SQL

    SQL string'i çalıştırılmadan önce `%`, `.format()`, f-string veya `+` ile üretiliyor.

    örüntü

Sorular

Tırnakları escape etmek SQL injection'ı önler mi?
Güvenilir şekilde değil. Escape etmek veritabanına, karakter kodlamasına ve sorgu içindeki bağlama göre değişir. Parametreli sorgular sorunu etkisizleştirmeye çalışmak yerine ortadan kaldırır.
RepoVerse SQL injection'ı nasıl buluyor?
İstek girdisini atamalar ve fonksiyon çağrıları boyunca — dosyalar arasında da — query, execute ve raw gibi çağrılara kadar izler ve girdi SQL metnine ulaştığında yoluyla birlikte izlenmiş bir bulgu raporlar. Sayısal dönüşümler izi bitirir.

İlgili

Güncellendi 2026-10-11