Bu dersin sınırı
Amaç savunmak. Saldırıyı yalnız tanımak için en küçük örnek gösterilir. Başkasının sistemini denemek suçtur; sınama yalnız sana ait ya da yazılı izin aldığın ortamda yapılır.
ops_ tabloları hayali bir portal için tohumlu üreteçle kuruldu. Gerçek bir sistemden alınmadı; süre ve okuma değerleri ölçüm değildir. Motor SQLite olduğu için günlükteki SQL Server sorguları çalıştırılmaz, metin olarak incelenir. Tabloları sorgularsın, sistem yönetimi komutlarını yalnız okursun.Sorun tek cümle
Kullanıcı girdisi metin birleştirmeyle sorguya girdiğinde motor neyin veri, neyin kod olduğunu ayıramaz. Temeli Güvenlik dersinde, dinamik SQL tarafı Dinamik SQL dersinde. Burada savunmayı bir bütün olarak kuruyoruz.
-- YANLIŞ: girdi metne ekleniyor DECLARE @sql NVARCHAR(MAX) = N'SELECT COUNT(*) FROM bank_customers WHERE full_name = ''' + @ara + N''''; EXEC (@sql); -- @ara değeri a' OR '1'='1 olursa koşul her satırda doğru olur
Katmanlı savunma
| Katman | Ne yapar | Tek başına yeter mi? |
|---|---|---|
| Parametreli sorgu | Değer kod olarak yorumlanmaz, tür ve uzunluk denetlenir | Değerler için asıl savunma budur |
| İzin listesi (beyaz liste) | Tablo ve sütun adı parametre olamaz, kabul edilenleri say | Adlar için şart; QUOTENAME ile birlikte |
| Girdi doğrulama | Tür, uzunluk, biçim, aralık. Her güven sınırında, yalnız istemcide değil | Hayır, ek katman |
| En az yetki | Uygulama hesabı sysadmin olmaz, yalnız gerekeni yapar | Açığı kapatmaz, zararı sınırlar |
| Hata mesajı | Ayrıntıyı kullanıcıya gösterme, günlüğe yaz | Hayır, yalnız bilgi sızıntısını azaltır |
| Kod inceleme ve izleme | EXEC, sp_executesql kullanan yordamları gözden geçir, günlüğü izle | Hayır, açığı bulmak içindir |
Doğru yazım
-- Dinamik SQL şart değilse kullanma
SELECT COUNT(*) FROM bank_customers WHERE full_name = @ara;
-- Şartsa değeri parametre olarak ver
EXEC sp_executesql N'SELECT COUNT(*) FROM bank_customers WHERE full_name = @a',
N'@a NVARCHAR(100)', @a = @ara;
İşe yaramayan ya da eksik savunmalar
| Yöntem | Neden yetmez |
|---|---|
| Tek tırnağı silmek ya da çiftlemek | Sayısal alanda tırnak gerekmez; kaçışlama asıl savunma olamaz. Belge süzmeyi güvenilir birincil savunma saymaz |
| Yalnız arayüzde doğrulama | İstemci atlanır, istek doğrudan gönderilebilir |
Yasak sözcük listesi (DROP, OR) | Eksik kalır, meşru girdiyi de bozar: "Orhan" adı gibi |
| Saklı yordama geçmek | Yordam içinde metin birleştiriyorsa sorun aynen sürer |
| Hata mesajını gizlemek | Açık yerinde kalır, yalnız görünmesi zorlaşır |
| ORM kullanmak | ORM'in ham SQL yolunda birleştirme yaparsan korunmazsın |
En az yetki günlükle nasıl kurulur?
"Bu hesap ne yapıyor?" sorusunu tahminle değil günlükle yanıtla. Hesap başına okuma ve yazma sayısı, hangi izinlerin gereksiz olduğunu gösterir. Uygulama hesabı yalnız gereken yordamlara EXECUTE almalı; ayrıntısı SQL Server güvenliği dersinde. Belge ayrıca xp_cmdshell kullanımını hiçbir ortamda önermez.
SELECT l.login_name, l.kind,
SUM(CASE WHEN a.event_type = 'read' THEN 1 ELSE 0 END) AS okuma,
SUM(CASE WHEN a.event_type = 'write' THEN 1 ELSE 0 END) AS yazma
FROM ops_logins l
LEFT JOIN ops_access_log a ON a.login_name = l.login_name
GROUP BY l.login_name, l.kind
ORDER BY l.login_name;
Günlükte iz: parmak izi işe yarar
Parametreli bir sorgu her çağrıda aynı biçimdedir. Girdi koda dönüşünce biçim değişir ve yeni bir parmak izi doğar. Kurgusal günlüğümüzde pazartesi akşamı arama sorgusunda bunu göreceksin. Portal aramayı parametresiz kuruyor, bu yüzden günlükte girdinin izi var. Bu aynı zamanda bir bulgudur: günlükte sabit değer gördüğün her sorgu, inceleme adayıdır.
İz bir kanıt başlangıcıdır, hüküm değildir: görünen adres uygulama sunucusudur, denemeyi yapan kişi günlükte yoktur. Girişleri uygulama katmanı günlüğüyle eşleştirmen gerekir.