Nguon: Microsoft Learn · .NET 8.0

Thay đổi đột phá (Breaking change): Forwarded Headers Middleware bỏ qua header X-Forwarded-* từ các proxy không xác định

Nguồn: Forwarded Headers Middleware ignores X-Forwarded-* headers from unknown proxies

Bắt đầu từ ASP.NET Core 8.0.17 và 9.0.6, Forwarded Headers Middleware (phần mềm trung gian xử lý header chuyển tiếp) bỏ qua tất cả header X-Forwarded-* từ các proxy không được cấu hình rõ ràng là đáng tin cậy. Thay đổi này được thực hiện để tăng cường bảo mật, vì danh sách proxy và IP trước đây không được áp dụng trong mọi trường hợp.

Phiên bản giới thiệu

ASP.NET Core 8.0.17 ASP.NET Core 9.0.6

Hành vi cũ

Trước đây, middleware khi không được cấu hình để sử dụng X-Forwarded-For, vẫn xử lý các header X-Forwarded-Prefix, X-Forwarded-ProtoX-Forwarded-Host từ bất kỳ nguồn nào. Hành vi đó có khả năng cho phép các proxy/client độc hại hoặc bị cấu hình sai giả mạo các header này và ảnh hưởng đến cách ứng dụng hiểu thông tin của client.

Hành vi mới

Bắt đầu từ các bản cập nhật dịch vụ .NET 8 và .NET 9, chỉ các header được gửi từ các proxy đáng tin cậy đã biết (được cấu hình qua ForwardedHeadersOptions.KnownProxiesForwardedHeadersOptions.KnownNetworks) mới được xử lý. Header từ các nguồn không xác định sẽ bị bỏ qua.

Lưu ý: Nếu triển khai của bạn phụ thuộc vào các forwarded header từ proxy không được cấu hình trong danh sách proxy tin cậy của ứng dụng, những header đó sẽ không còn được chấp nhận nữa.

Thay đổi này có thể gây ra các vấn đề như redirect vô hạn (infinite redirect) nếu bạn đang dùng HTTPS redirection middleware và TLS termination trong proxy. Nó cũng có thể khiến xác thực (authentication) thất bại nếu bạn đang dùng TLS termination và kỳ vọng nhận được request HTTPS.

Loại thay đổi đột phá

Đây là thay đổi hành vi (behavioral change).

Lý do thay đổi

Thay đổi được thực hiện để tăng cường bảo mật, vì danh sách proxy và IP trước đây không được áp dụng trong mọi trường hợp.

Hành động được khuyến nghị

Xem xét lại cấu trúc triển khai (deployment topology) của bạn. Đảm bảo rằng tất cả các proxy server hợp lệ đứng trước ứng dụng đều được thêm vào KnownProxies hoặc KnownNetworks trong cấu hình ForwardedHeadersOptions.

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

Hoặc, cho một mạng:

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

Nếu bạn muốn bật lại hành vi cũ (không khuyến nghị do rủi ro bảo mật), bạn có thể thực hiện bằng cách xóa danh sách KnownNetworksKnownProxies trong ForwardedHeadersOptions để cho phép bất kỳ proxy hoặc mạng nào chuyển tiếp các header này.

Bạn cũng có thể đặt biến môi trường ASPNETCORE_FORWARDEDHEADERS_ENABLED thành true, điều này sẽ xóa danh sách và bật ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto.

Đối với các ứng dụng nhắm mục tiêu .NET 9 hoặc cũ hơn, bạn có thể đặt switch AppContext Microsoft.AspNetCore.HttpOverrides.IgnoreUnknownProxiesWithoutFor thành "true" hoặc 1 để quay lại hành vi cũ. Hoặc đặt biến môi trường MICROSOFT_ASPNETCORE_HTTPOVERRIDES_IGNORE_UNKNOWN_PROXIES_WITHOUT_FOR.

Lưu ý: Trong môi trường cloud, IP của proxy có thể thay đổi trong suốt vòng đời của ứng dụng, và ASPNETCORE_FORWARDEDHEADERS_ENABLED đôi khi được dùng để làm cho forwarded header hoạt động.

API bị ảnh hưởng