SQL Injection
- Türkçe karşılığı
- SQL enjeksiyonu
- Okunuşu
- es-kyu-el incekşın ya da sikuıl incekşın
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
SQL injection, kullanıcı girdisinin veritabanı sorgusunun parçası sayıldığı ve saldırganın erişmemesi gereken verileri okuyup değiştirebildiği saldırıdır.
SQL injection nedir?
SQL injection, bir uygulamanın SQL sorgusunu kullanıcı girdisini doğrudan sorgu metnine yapıştırarak oluşturmasıyla ortaya çıkar. Girdi SQL sözdizimi içeriyorsa veritabanı bunu geliştiricinin kodundan ayıramaz ve çalıştırır; böylece sorgunun ne yaptığı değişir.
Klasik örnek, yazılan kullanıcı adını doğrudan WHERE name = '...' ifadesine ekleyen bir giriş kontrolüdür. ' OR '1'='1 girildiğinde tırnak kapanır ve her zaman doğru olan bir koşul eklenir; sorgu tablodaki her kullanıcıyla eşleşebilir. Gerçek saldırılar tabloların tamamını dışarı aktarabilir, girişleri atlatabilir veya kayıtları değiştirebilir.
Güvenilir savunma, hazır ifadeler (prepared statements) olarak da bilinen parametreli sorgulardır. Bir metin oluşturmak yerine sorguyu yer tutucularla gönderir, değerleri ayrıca iletirsiniz; böylece veritabanı bunları her zaman veri olarak ele alır, asla kod olarak değil. ORM'ler ve sorgu oluşturucular bunu varsayılan olarak yapar; girdi doğrulama, en az ayrıcalıklı veritabanı hesapları ve ham veritabanı hatalarının kullanıcılardan gizlenmesi de bir şey gözden kaçarsa zararı sınırlar.
Tırnakları elle escape etmek ya da şüpheli sözcükleri engellemek güvenilir bir çözüm değildir; saldırganlar filtreleri aşmanın yollarını bulur. SQL injection, XSS ile ilişkilidir: ikisi de verinin kod sanıldığı enjeksiyon açıklarıdır; ancak SQL injection sunucudaki veritabanını, XSS ise kullanıcının tarayıcısını hedef alır.
Bir bakışta
Önemli noktalar
- SQL injection, kullanıcı girdisi sorgunun kodunun bir parçası olduğunda ortaya çıkar.
- Verileri açığa çıkarabilir, değiştirebilir veya silebilir; girişleri atlatabilir.
- Parametreli sorgular birincil savunmadır.
- ORM'ler yardımcı olur, ancak ham sorgu yöntemleri yine de savunmasız olabilir.
- En az ayrıcalıklı veritabanı hesapları, saldırının zararını sınırlar.
Örnek
const email = req.body.email; // untrusted input from a form
// Vulnerable: input is pasted into the SQL text and can change the query
const bad = await db.query(
`SELECT * FROM users WHERE email = '${email}'`
);
// Safe: the value is sent separately and is always treated as data
const good = await db.query(
"SELECT * FROM users WHERE email = $1",
[email]
);Sık sorulan sorular
SQL injection nasıl önlenir?
Dışarıdan veri içeren her sorguda parametreli sorgular veya hazır ifadeler kullanın; böylece değerler asla SQL olarak yorumlanmaz. Ek katman olarak girdi doğrulama, en az ayrıcalıklı veritabanı hesapları ve dikkatli hata yönetimi ekleyin.
ORM'ler SQL injection'ı önler mi?
ORM'ler normal yöntemlerinde parametreli sorgular kullanır ve bu, SQL injection'ın çoğunu önler. Ancak kullanıcı girdisinden sorgu metni oluşturuyorsanız, bir ORM'in ham SQL özellikleri yine de savunmasız olabilir.
NoSQL veritabanlarına da enjeksiyon saldırısı yapılabilir mi?
Evet. NoSQL injection, güvenilmeyen girdinin bir sorgunun yapısını değiştirdiği benzer bir saldırıdır; örneğin düz bir metin yerine sorgu operatörleri içeren bir nesne göndermek gibi. Çözüm aynı mantığı izler: girdi türlerini doğrulayın ve sorguları asla doğrudan ham girdiden oluşturmayın.
Sık karşılaştırılanlar
İlgili sayfalar
- SQLVeritabanları, s. 29SQL, ilişkisel veritabanlarıyla çalışmanın standart dilidir; tablo oluşturmak ve içindeki veriyi eklemek, sorgulamak, güncellemek ve silmek için kullanılır.
- VeritabanıVeritabanları, s. 37Veritabanı, bilgisayarda düzenli biçimde saklanan ve uygulamaların verimlice kaydedip arayıp güncelleyebildiği, bir yazılımla yönetilen veri topluluğudur.
- ORMVeritabanları, s. 24ORM, veritabanı tablolarını programlama dilinizdeki nesnelere eşleyen ve ham SQL yerine kodla veri okuyup yazmanızı sağlayan bir kütüphanedir.
- XSSGüvenlik, s. 47XSS, saldırganın güvenilir bir siteye kötü amaçlı JavaScript enjekte edip bu kodu diğer kullanıcıların tarayıcısında çalıştırmasına yol açan zafiyettir.
- NoSQLVeritabanları, s. 21NoSQL, veriyi ilişkisel tablolar yerine doküman, anahtar-değer çifti, geniş sütun ya da çizge gibi başka modellerde saklayan veritabanı ailesidir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin