Yan yana
SQL InjectionvsXSS
SQL injection ile XSS arasındaki fark nedir?
Güncellendi 2 dk okuma6 fark
Kısaca
SQL injection sunucuya saldırganın veritabanı komutlarını çalıştırtır; XSS ise saldırganın JavaScript'ini başka kullanıcıların tarayıcısında çalıştırır.
SQL Injection
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 sayfasını okuXSS
Siteler Arası Betik Çalıştırma (Cross-Site Scripting)
XSS, 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.
XSS sayfasını okuSQL Injection ve XSS karşılaştırması
| Özellik | SQL Injection | XSS |
|---|---|---|
| Enjekte edilen kod | SQL | JavaScript ya da HTML |
| Çalıştığı yer | Veritabanı sunucusunda | Diğer kullanıcıların tarayıcılarında |
| Kim zarar görür | Sitenin verisi ve içindeki herkes | Siteyi ziyaret eden kullanıcılar, tek tek |
| Tipik zarar | Çalınan veri, değiştirilen ya da silinen kayıtlar, atlatılan girişler | Çalınan oturumlar, kurban adına işlemler, tahrip edilen sayfalar |
| Asıl savunma | Parametreli sorgular ya da bir ORM | Çıktıyı kaçışlamak ve Content Security Policy |
| OWASP Top 10 | Injection başlığı altında | O da Injection başlığı altında |
Fark, açıklamalı
İkisi de enjeksiyon saldırısıdır: güvenilmeyen girdi, veri yerine kod olarak işlenir. SQL injection'da kullanıcı adı gibi bir girdi bir veritabanı sorgusunun içine yapıştırılır; böylece ' OR '1'='1 gibi bir değer sorgunun yaptığı işi değiştirir. Siteler arası betik çalıştırmada ise yorum gibi bir girdi kaçış uygulanmadan (escaping) bir web sayfasına konur; içindeki bir <script> etiketi ya da olay işleyicisi de sayfayı görüntüleyen herkesin tarayıcısında çalışır.
Fark, enjekte edilen kodun nerede çalıştığı ve neye erişebildiğidir. SQL injection veritabanı sunucusunda çalışır; veriyi okuyabilir, değiştirebilir ya da silebilir, girişleri atlatabilir, hatta bazen makinenin kontrolünü ele geçirebilir. XSS ise kurbanların tarayıcılarında, sitenin yetkileriyle çalışır; oturum token'larını çalabilir, kullanıcı adına işlem yapabilir ya da sayfada gösterilenleri değiştirebilir.
Savunmalar tek bir fikri izler: kodla veriyi, buluştukları yerde ayrı tutun. SQL injection'a karşı sorguları metinlerden kurmak yerine parametreli sorgular ya da bir ORM kullanın ve veritabanı hesabına yalnızca ihtiyaç duyduğu yetkileri verin. XSS'e karşı çıktıyı bağlamına uygun biçimde kaçışlayın; React gibi modern framework'ler bunu varsayılan olarak yapar. Ham HTML eklemekten kaçının ve ikinci bir katman olarak Content Security Policy ekleyin.
Sık yapılan bir yanlış, girdiyi doğrulamanın ya da filtrelemenin yeterli olduğu düşüncesidir. Yasak listeleri kodlama hilelerini ve uç durumları kaçırır; güvenilir çözümler veritabanları için parametreli sorgular, HTML için de bağlama duyarlı çıktı kodlamadır. Girdi doğrulama asıl savunma değil, ek bir katmandır.
Hangisi nerede risk oluşturur?
SQL Injection riski şu durumlarda var:
- Kod, SQL'i kullanıcı girdisiyle metinleri birleştirerek kuruyor.
- ORM'nin güvenli metotlarının atlandığı yerlerde ham sorgular kullanılıyor.
- Uygulamanın kullandığı veritabanı hesabı ihtiyacından çok daha fazlasını okuyup değiştirebiliyor.
XSS riski şu durumlarda var:
- Sayfalarda yorumlar, isimler ya da profiller gibi kullanıcıların ürettiği içerik gösteriliyor.
- Kod, HTML'i innerHTML ya da bir framework'ün ham HTML kaçış kapısıyla ekliyor.
- Arama terimleri ya da URL parametreleri sayfaya geri yansıtılıyor.
Açık bırakan satır ve düzeltmesi (Node.js)
// Vulnerable: input becomes part of the SQL
const sql = "SELECT * FROM users WHERE email = '" + req.query.email + "'";
await db.query(sql);
// Fixed: a parameterized query keeps input as data
await db.query("SELECT * FROM users WHERE email = $1", [req.query.email]);// Vulnerable: input becomes part of the page's HTML
comment.innerHTML = userComment;
// Fixed: insert it as text, so tags are shown, not run
comment.textContent = userComment;Sık sorulan sorular
Hangisi daha tehlikeli, SQL injection mı XSS mi?
SQL injection tek bir saldırıda bütün bir veritabanını açığa çıkarabilir ya da yok edebilir; bu yüzden en kötü senaryosu genellikle daha büyüktür. XSS kullanıcıları tek tek vurur, ama popüler bir sitede birçok hesabı ele geçirebilir.