Ana içeriğe geç

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.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/sql-injection

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

SQL injection. Bir giriş formu ' OR '1'='1 adını alır. Metinler birleştirilerek kurulan sorgu WHERE name = '' OR '1'='1' olur; bu her zaman doğru olan bir koşuldur, bu yüzden veritabanı bütün kullanıcıları döndürür. Parametreli sorguda girdi ayrı olarak bir değer şeklinde gönderilir; veritabanı tam olarak bu tuhaf ada sahip bir kullanıcı arar ve hiç bulamaz.Metin birleştirme' OR '1'='1SELECT * FROM usersWHERE name = '' OR '1'='1''1'='1' → her zaman doğruBütün kullanıcılargiriş atlatılırParametreli sorgu' OR '1'='1SELECT * FROM usersWHERE name = $1ayrı gönderilen değer: ' OR '1'='10 satırbu adda kullanıcı yokformda yazılan adformda yazılan ad
Çözüm tırnakları süzmek değil, kod ile veriyi ayrı tutmaktır; böylece kullanıcı ne yazarsa yazsın her zaman yalnızca veri olur.

Ö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

Savunmasız sorgu ile parametreli sorgu (Node.js)javascript
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

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar