Bios.Web.Hardening 0.2.0

Bios.Web.Hardening

Bir web servisinin dış kapısındaki üç koruma, tek pakette: her cevaba yazılan güvenlik başlıkları, yalnız tanınan proxy'ye inanan X-Forwarded-For işleme ve girişten sonra nereye dönüleceğini doğrulayan yol denetimi. Üçünün de varsayılanı en dar olan taraftır; unutmanın bedeli açık kapı değil, kapalı kapıdır.

SecurityHeaders. Content-Security-Policy başta olmak üzere güvenlik başlıklarını her cevaba yazar; cevap hangi durum koduyla dönerse dönsün. Hazır profiller: ApiOnly belge sunmayan bir servis için her kaynağı kapatır, NoScript hiç betik çalıştırmayan bir yüzeyin bunu tarayıcıya söylemesini sağlar, NoScriptPostingTo buna formun çıkabileceği adresleri ekler.

TrustedForwardedHeaders. X-Forwarded-For herhangi bir istemcinin gönderebileceği bir başlıktır; körü körüne inanılırsa denetim izi ve hız sınırı kandırılır. Bu ara katman başlığa yalnız yapılandırılmış güvenilen proxy'lerden geldiğinde inanır, listede kimse yoksa hiçbirine inanmaz.

ReturnPath. Girişten sonra "kaldığın yere dön" değerini doğrular. Yalnız kök / ile başlayan, tek gövdeli, kontrol karakteri içermeyen bir yol kabul edilir; başka bir adrese çıkabilecek her değer varsayılana düşer. Open redirect bu kapıdan geçmez.

Bağlama

// Program.cs
builder.Services.AddBiosHardening(builder.Configuration);   // Forwarding bolumunu okur

var app = builder.Build();

app.UseTrustedForwardedHeaders();   // istek hattinda ilk sirada
app.UseSecurityHeaders(SecurityHeaderOptions.ApiOnly);

Sayfa sunan bir yüzeyde profil değişir. Giriş sonrası devir yapan bir yüzey, formun çıkabileceği adresleri devir listesinin kendisinden verir; böylece politika ile izin listesi birbirinden ayrı düşemez:

app.UseSecurityHeaders(SecurityHeaderOptions.NoScriptPostingTo(devirAdresleri));

Dönüş yolu, çağıran unutamayacağı için tek bir çağrıda hem doğrulanır hem seçilir:

var hedef = ReturnPath.Or(istenen, "/");   // guvenli degilse "/"

Yapılandırma

Bölüm adı Forwarding; adı pakette ForwardingOptions.SectionName olarak durur, tüketici tekrar yazmaz.

Anahtar Anlamı
KnownProxies Güvenilen proxy'lerin tam adresleri
KnownNetworks Güvenilen aralıklar, CIDR biçiminde (10.0.0.0/8)
Limit Kaç durak geriye gidileceği; varsayılan 1
AcknowledgeNoProxy Bu sunucuya doğrudan gelindiğini, yani proxy yokluğunun bilinçli olduğunu bildirir
{
  "Forwarding": {
    "KnownProxies": [ "10.0.0.7" ],
    "KnownNetworks": [ "10.0.0.0/8" ],
    "Limit": 1
  }
}

Proxy arkasında olmayan bir sunucu listeleri boş bırakır ama bunu söyler:

{
  "Forwarding": { "AcknowledgeNoProxy": true }
}

Dikkat

Sıra önemlidir. UseTrustedForwardedHeaders çağıran adresini okuyan ya da isteğin TLS üzerinden gelip gelmediğine bakan her şeyden önce çalışmalıdır; sonra çalışırsa denetim izi proxy'nin adresini yazmış olur.

Boş liste kimseye inanmamak demektir. Bu meşru bir kurulumdur ve açılışı engellemez. Ama unutulmuş bir ayar da aynı görüntüyü verdiği için ikisi ayrılmıştır: bölüm hiç yoksa açılışta Error seviyesinde, gerekçesiyle birlikte bildirilir; AcknowledgeNoProxy yazıldığında aynı durum sıradan bir bilgi satırına döner. Yanlış bölüm adıyla bağlanan bir kurulumun sessizce her şeyi reddetmesi böylece görünür olur.

Anlamsız değer açılışı durdurur. Ayrışmayan bir adres, CIDR olmayan bir aralık ya da birden küçük bir Limit kimsenin kasten yazmayacağı değerlerdir; sunucu gerekçesini söyleyip açılmaz. Ayarlanmamış bir ortam değişkeninden gelen boş girdi ise ayar yokluğu sayılır, hata değil.

Limiti proxy zinciriniz kadar tutun. Bir güvenilen proxy varken ikiye çıkarmak, ziyaretçinin başlığa kendi yazdığı duraklara inanmaya başlamak demektir.

No packages depend on Bios.Web.Hardening.

.NET 10.0

  • No dependencies.

Version Downloads Last updated
0.2.0 101 08/29/2026
0.1.0 2 08/29/2026