Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
.NET 11 ile ASP.NET Core Güvenliği: Fetch Metadata Tabanlı Otomatik CSRF Koruması, Device Bound Session Credentials ve TLS Channel Binding
.NET 11, WebApplication.CreateBuilder ile kurulan uygulamalara Sec-Fetch-Site ve Origin header'larına bakan, varsayılan açık bir CSRF koruması ekliyor; ama kararı yalnız form okuyan endpoint'ler uyguluyor ve DisableAntiforgery onu da kapatıyor. Karar tablosunu, CORS ile güvenilen origin'leri, aynı kuralları .NET 10'da uygulayan bir middleware'i, deneysel DBSC'yi, TLS channel binding'i, authorization metadata birleşmesini ve geçiş kontrol listesini anlatıyoruz.
ASP.NET Core'da Güvenlik Olaylarını Gözlemlemek: Authentication, Authorization ve Identity Metrikleri, Audit Trail ve Alarm
.NET 10'un authentication, authorization ve Identity metrikleri 401, 403 ve hesap kilitlenmelerini sayar ama kullanıcı adını ve policy adını bilinçli olarak taşımaz; kim, neyi, ne zaman sorusu audit trail'in işidir. Metrikleri OpenTelemetry ve Prometheus ile topluyor, gerçek etiketleri testle doğruluyor, alarm kuralları yazıyor ve değişikliği yakalayan hash zincirli bir audit trail kuruyoruz.
Kestrel ve Request Limitleri: Body Size, Header Timeout, Request Timeout'lar ve Yavaş İstemcilere Karşı Ayarlar
Kestrel varsayılan olarak 28,6 MB gövdeye, 30 saniyelik header süresine ve sınırsız request süresine izin verir; request timeout ise CancellationToken taşınmazsa hiçbir şeyi durdurmaz. Gerçek varsayılanları koddan okuyor, gövde, header, form ve JSON limitlerini, yavaş istemcilere karşı RequestHeadersTimeout ile MinRequestBodyDataRate'i, request timeouts middleware'ini ve Kestrel ile reverse proxy arasındaki iş bölümünü ölçümlerle anlatıyoruz.
Antiforgery Derinlemesine: Cookie Authentication, SPA ve Minimal API'lerde CSRF Koruması
ASP.NET Core'un antiforgery middleware'i isteği reddetmez, sonucu bir feature'a yazar; minimal API'de bu sonucu yalnız form binding uygular, bu yüzden cookie ile çalışan JSON endpoint'leri token'sız istekleri 200 ile kabul eder. Token çiftinin iç yapısını, Angular'ın XSRF-TOKEN pattern'ini, zorunlu doğrulama yapan endpoint filter'ı, login sonrası token yenilemeyi ve DisableAntiforgery'nin bilinçli kullanımını gerçek çıktılarla anlatıyoruz.
Security Header'ları ve Nonce'lu CSP'yi ASP.NET Core'dan Üretmek: HSTS Preload, COOP/COEP/CORP, Permissions-Policy ve Raporlama Endpoint'i
Nonce'lu CSP her istekte değişir ve yanıtın türüne bağlıdır, bu yüzden Nginx'te değil uygulamada üretilmeli ve HTML hiçbir katmanda cache'lenmemeli. ASP.NET Core'da API ve HTML için ayrı header setleri üreten tek bir middleware, Angular index.html'ine nonce enjeksiyonu, Report-Only ve boyut ile rate limit korumalı rapor endpoint'i, HSTS preload riski ve COOP/COEP/CORP'u gerçek header çıktılarıyla kuruyoruz.
Rate Limiting Derinlemesine: Algoritmalar, Partition Key'leri, Chained Limiter'lar ve Çoklu Instance
ASP.NET Core'un rate limiter'ları process belleğinde yaşar; iki instance limiti iki katına çıkarır, proxy arkasında ise doğru IP olmadan herkes aynı partition'a düşer. Fixed window, sliding window ve token bucket'ı aynı trafikle karşılaştırıyor; queue sırası, partition key'leri, CreateChained, varsayılan 503 yerine 429 ve Retry-After, paylaşılan policy tuzağı ve kullanıcı adı başına login limitini gerçek çıktılarla gösteriyoruz.
Data Protection Derinlemesine: Key Ring, Rotation, Key Storage, Key'leri Şifrelemek ve Çoklu Instance
Çok instance'lı ASP.NET Core uygulamasında sebepsiz logout'lar ve boş gövdeli 400'ler genelde instance başına ayrı Data Protection key ring'inden gelir. Key ring'in ömrünü, rotation ve revocation'ı, purpose hiyerarşisini, dosya, Redis ve veritabanı store'larını, key'leri certificate ile şifrelemeyi ve SetApplicationName'in rolünü gerçek log'larla anlatıyoruz.
Authorization'ın İç Yapısı: Policy Provider, Requirement Handler'lar, IAuthorizationMiddlewareResultHandler ve Policy Testleri
AuthorizationMiddleware her istekte endpoint metadata'sını tek policy'de birleştirir, authenticate eder, handler'ları çalıştırır ve sonucu 401 ya da 403'e çevirir. Handler'lar arasındaki OR, requirement'lar arasındaki AND ve Fail()'in veto etkisini gerçek çıktılarla gösteriyor; dinamik policy provider, IAuthorizationRequirementData, ProblemDetails dönen 403 ve endpoint × kullanıcı test matrisi kuruyoruz.
Angular 11'den 22'ye ve Tarayıcılarda Frontend Güvenliğinde Değişenler
Angular 11'den 22'ye güvenlik özelliklerinin çoğu yeni major'larla değil patch'lerle geldi; eski bir projeyi denetlerken major'a değil tam sürüme bakmak gerekiyor. Bu yazıda Trusted Types'tan autoCsp'ye ve SSR allowedHosts'a kadar her özelliğin geldiği sürümü paket tarball'larından doğruluyor, 22.0.8'de XSRF header'ının gönderilmediğini headless Chrome'da gösteriyor, tarayıcılardaki değişiklikleri topluyor ve çalıştırılabilir bir denetim script'i çıkarıyoruz.
npm Supply Chain'i Sertleştirmek: Lifecycle Script'leri, Release Cooldown, Provenance ve Trusted Publishing
npm supply chain'i sertleştirmenin üç ayağı var: kurulum script'lerini onay listesiyle sınırlamak, yeni sürümleri birkaç gün bekletmek ve publish token'larını trusted publishing ile ortadan kaldırmak. Bu yazıda npm 11 ve 12'nin allowScripts policy'sini, pnpm'in allowBuilds ve minimumReleaseAge ayarlarını, npm min-release-age'i, npm audit signatures çıktısını ve OIDC tabanlı trusted publishing'i yerel bir registry'de gerçek kurulumlarla deniyoruz.
Angular SSR Güvenliği: allowedHosts, Host Header Doğrulama, TransferState ve Bundle'a Sızan Secret'lar
Angular SSR'da sunucu, göreli HttpClient URL'lerini gelen isteğin Host header'ına göre çözer; bu yüzden allowedHosts'u açık adlarla doldur, proxy header'larına yalnız güvenilir bir proxy arkasında güven ve API adresini Host'tan türetme. Yerel bir SSR sunucusunda SSRF'yi, 2026 advisory'lerini, TransferState'e sızan alanları, SSR'da nonce'lu CSP'yi ve bundle ile source map'e giren secret'ları gerçek çıktılarla gösteriyoruz.
Üçüncü Parti Script'ler, iframe'ler ve postMessage: sandbox, frame-ancestors, Permissions-Policy ve Güvenli Mesajlaşma
Sayfana script etiketiyle eklenen üçüncü parti kod senin origin'inde ve senin yetkinle çalışır; onu kendi origin'indeki sandbox'lı bir iframe'e taşı, sayfanı frame-ancestors header'ıyla çerçevelenmeye kapat, kullanmadığın API'leri Permissions-Policy ile kapat ve postMessage'da origin, kaynak pencere ve şemayı doğrula. Hepsini yerel üç origin'li bir lab'da headless Chrome ve Vitest ile gerçek çıktılarla gösteriyoruz.