转发标头中间件忽略未知代理中的 X-Forwarded-* 标头

从 ASP.NET Core 8.0.17 和 9.0.6 开始,转发标头中间件将忽略未显式配置为受信任的代理中的所有 X-Forwarded-* 标头。 此更改是为了增强安全性,因为代理和 IP 列表在所有情况下都未应用。

引入的版本

ASP.NET Core 8.0.17 ASP.NET Core 9.0.6

以前的行为

以前,当未配置为使用X-Forwarded-For、处理X-Forwarded-PrefixX-Forwarded-ProtoX-Forwarded-Host来自任何源的标头时,中间件。 该行为可能允许恶意或配置错误的代理/客户端欺骗这些标头,并影响应用程序对客户端信息的理解。

新行为

从 .NET 8 和 .NET 9 服务版本开始,仅处理由已知受信任的代理发送的标头(按配置方式 ForwardedHeadersOptions.KnownProxiesForwardedHeadersOptions.KnownNetworks)。 忽略来自未知源的标头。

注释

如果部署依赖于未在应用程序受信任的代理列表中配置的代理的转发标头,则不再遵循这些标头。

如果使用 HTTPS 重定向中间件并在代理中使用 TLS 终止,则此更改可能会导致发生无限重定向等行为。 如果使用的是 TLS 终止并需要 HTTPS 请求,则它还可能导致身份验证失败。

破坏性变更的类型

此更改是 行为更改

更改原因

更改是为了加强安全性,因为代理和 IP 列表在所有情况下都未应用。

查看部署拓扑。 确保将应用前面的所有合法代理服务器正确添加到 KnownProxies 配置或 KnownNetworks 配置中 ForwardedHeadersOptions

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

或者,对于网络:

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

如果希望启用之前的行为(由于安全风险不建议这样做),可以通过清除 KnownNetworksKnownProxies 列出 ForwardedHeadersOptions 以允许任何代理或网络转发这些标头来执行此作。

还可以将 ASPNETCORE_FORWARDEDHEADERS_ENABLED 环境变量设置为 true,这将清除列表并启用 ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto

对于面向 .NET 9 或更早版本的应用程序,可以将 Microsoft.AspNetCore.HttpOverrides.IgnoreUnknownProxiesWithoutFor 开关设置为"true"1返回到以前的行为。 或者,设置 MICROSOFT_ASPNETCORE_HTTPOVERRIDES_IGNORE_UNKNOWN_PROXIES_WITHOUT_FOR 环境变量。

注释

在云环境中,代理 IP 可以在应用的生存期内更改,有时 ASPNETCORE_FORWARDEDHEADERS_ENABLED 用于使转发标头正常工作。

受影响的 API

另请参阅