Thay đổi đột phá (Breaking change): Forwarded Headers Middleware bỏ qua header X-Forwarded-* từ các proxy không xác định
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-Proto và X-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.KnownProxies và ForwardedHeadersOptions.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.
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
KnownProxies = { IPAddress.Parse("YOUR_PROXY_IP") }
});Hoặc, cho một mạng:
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 KnownNetworks và KnownProxies 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.