Ana içeriğe geç
Kesit SQL
İleri · Modern SQL

Güvenlik: SQL injection ve yetkilendirme

Parametreli sorgu, en az yetki ilkesi, GRANT/REVOKE.

Uygulamada aç, 4 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

SQL injection

Kullanıcı girdisini doğrudan sorgu metnine eklemek, en eski ve hâlâ en yaygın güvenlik açıklarından biridir.

-- Uygulama kodu (YANLIŞ):
sorgu = "SELECT * FROM users WHERE email = '" + girdi + "'"

-- Saldırgan girdi olarak şunu yazar:  ' OR '1'='1
-- Oluşan sorgu:
SELECT * FROM users WHERE email = '' OR '1'='1'   -- tüm kullanıcılar!

Çözüm: parametreli sorgu

# Python örneği (DOĞRU)
cursor.execute("SELECT * FROM users WHERE email = %s", (girdi,))

Parametre değeri hiçbir zaman SQL kodu olarak yorumlanmaz. ORM'ler (SQLAlchemy, Django ORM, Hibernate) bunu varsayılan yapar; ham SQL yazarken de mutlaka parametre kullan. Tablo/sütun adı gibi parametrelenemeyen kısımlar için beyaz liste kullan.

Yetkilendirme (DCL)

CREATE ROLE analyst;
GRANT SELECT ON sales.orders TO analyst;
GRANT SELECT, INSERT ON staging.events TO etl_user;
REVOKE INSERT ON staging.events FROM etl_user;

Bir maskeleme örneği

SELECT first_name,
       substr(email, 1, 2) || '***' || substr(email, instr(email, '@')) AS maskeli_email
FROM customers
WHERE email IS NOT NULL
LIMIT 5;
Alıştırmalara geç (4)