Udostępnij przez


Oprogramowanie pośredniczące nagłówków przekazywanych ignoruje nagłówki X-Forwarded-* z nieznanych serwerów proxy

Począwszy od ASP.NET Core w wersjach 8.0.17 i 9.0.6, warstwa pośrednicząca zarządzająca nagłówkami przekazywanymi ignoruje wszystkie nagłówki X-Forwarded-* z serwerów proxy, które nie zostały jawnie skonfigurowane jako zaufane. Ta zmiana została wprowadzona na potrzeby wzmacniania zabezpieczeń, ponieważ listy serwerów proxy i adresów IP nie były stosowane we wszystkich przypadkach.

Wersja wprowadzona

ASP.NET Core 8.0.17 ASP.NET Core 9.0.6

Poprzednie zachowanie

Wcześniej oprogramowanie pośredniczące, gdy nie było skonfigurowane do używania X-Forwarded-For, przetwarzało nagłówki X-Forwarded-Prefix, X-Forwarded-Proto, i X-Forwarded-Host z dowolnego źródła. To zachowanie mogło umożliwiać złośliwym lub błędnie skonfigurowanym serwerom proxy albo klientom zmianę tych nagłówków, co wpływa na sposób, w jaki aplikacja interpretuje informacje o kliencie.

Nowe zachowanie

Począwszy od wydań serwisowych .NET 8 i .NET 9, przetwarzane są tylko nagłówki wysyłane przez znane i zaufane serwery proxy, zgodnie z konfiguracją przy użyciu ForwardedHeadersOptions.KnownProxies i ForwardedHeadersOptions.KnownNetworks. Nagłówki z nieznanych źródeł są ignorowane.

Uwaga / Notatka

Jeśli wdrożenie opierało się na przesyłanych nagłówkach z serwerów proxy, które nie zostały skonfigurowane na liście zaufanych serwerów proxy aplikacji, te nagłówki nie będą już uwzględniane.

Ta zmiana może spowodować zachowanie, takie jak nieskończone przekierowania, jeśli używasz middleware do przekierowań HTTPS i terminację TLS w serwerze proxy. Może to również spowodować niepowodzenie uwierzytelniania, jeśli używasz zakończenia protokołu TLS i oczekujesz żądania HTTPS.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Zmiana została wprowadzona na potrzeby wzmacniania zabezpieczeń, ponieważ listy serwerów proxy i adresów IP nie były stosowane we wszystkich przypadkach.

Przejrzyj topologię wdrożenia. Upewnij się, że wszystkie autoryzowane serwery proxy przed twoją aplikacją są prawidłowo dodawane do KnownProxies lub KnownNetworks w konfiguracji ForwardedHeadersOptions.

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    KnownProxies = { IPAddress.Parse("YOUR_PROXY_IP") }
});

Lub dla sieci:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    KnownNetworks = { new IPNetwork(IPAddress.Parse("YOUR_NETWORK_IP"), PREFIX_LENGTH) }
});

Jeśli chcesz włączyć poprzednie zachowanie, które nie jest zalecane ze względu na zagrożenia bezpieczeństwa, możesz to zrobić, czyszcząc listy KnownNetworks i KnownProxies w ForwardedHeadersOptions, zezwalając dowolnemu serwerowi proxy lub sieci na przesyłanie tych nagłówków.

Można również ustawić zmienną ASPNETCORE_FORWARDEDHEADERS_ENABLED środowiskową na true, która czyści listy i włącza wartość ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto.

W przypadku aplikacji przeznaczonych dla platformy .NET 9 lub wcześniejszych, można ustawić przełącznik Microsoft.AspNetCore.HttpOverrides.IgnoreUnknownProxiesWithoutFor na lub "true" aby wrócić do poprzedniego zachowania. Alternatywnie ustaw zmienną środowiskową MICROSOFT_ASPNETCORE_HTTPOVERRIDES_IGNORE_UNKNOWN_PROXIES_WITHOUT_FOR .

Uwaga / Notatka

W środowiskach chmurowych adresy IP serwera proxy mogą zmieniać się przez cały okres życia aplikacji, a ASPNETCORE_FORWARDEDHEADERS_ENABLED jest czasami używany, aby umożliwić działanie nagłówków przekazanych dalej.

Interfejsy API, których dotyczy problem

Zobacz także