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;
- En az yetki ilkesi: Herkes işini yapacak kadar yetki alsın. Analistler üretim tablolarına yazamamalı.
- Satır düzeyi güvenlik (RLS): Bölge müdürü sadece kendi bölgesinin satırlarını görsün.
- Hassas veri: Kişisel verileri (KVKK/GDPR) maskele veya view ile gizle; e-posta, TCKN, telefon gibi sütunlara erişimi kısıtla.
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;