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
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);
});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
- NoSQL injection: MongoDB sorgularını istekten yeniden yazmakMongoDB $where ifadeleri ve {"$ne": null} gibi operatörler istek verisinin sorguyu yeniden yazmasına nasıl izin verir (CWE-943); örnekler ve çözüm.
- Komut injection: bir parametre shell komutu çalıştırdığındaKomut injection (CWE-78) bir istek parametresini nasıl ikinci bir shell komutuna çevirir, güvenli execFile kalıbı ve girdiyle beslenen exec çağrılarını bulma.
- Kod, secret ve bağımlılıklar için GitHub güvenlik taramasıGitHub reposunu injection açıkları, sızmış secret'lar ve zafiyetli bağımlılıklar için tara. İstekten tehlikeli çağrıya veri akışı izi ve çözüm önerileri.
Güncellendi 2026-10-11