Skip to content

Commit 91bc414

Browse files
[release/2.3] Forwarded Headers Middleware: Ignore XForwardedHeaders from Unknown Proxy (#61642)
1 parent 58a29e7 commit 91bc414

File tree

3 files changed

+71
-8
lines changed

3 files changed

+71
-8
lines changed

eng/PatchConfig.props

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ Later on, this will be checked using this condition:
2727
<PackagesInPatch>
2828
</PackagesInPatch>
2929
</PropertyGroup>
30+
<PropertyGroup Condition=" '$(VersionPrefix)' == '2.3.3' ">
31+
<PackagesInPatch>
32+
Microsoft.AspNetCore.HttpOverrides;
33+
</PackagesInPatch>
34+
</PropertyGroup>
3035
</Project>

src/Middleware/HttpOverrides/src/ForwardedHeadersMiddleware.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,16 +227,17 @@ public void ApplyForwarders(HttpContext context)
227227
for ( ; entriesConsumed < sets.Length; entriesConsumed++)
228228
{
229229
var set = sets[entriesConsumed];
230-
if (checkFor)
230+
231+
// For the first instance, allow remoteIp to be null for servers that don't support it natively.
232+
if (currentValues.RemoteIpAndPort != null && checkKnownIps && !CheckKnownAddress(currentValues.RemoteIpAndPort.Address))
231233
{
232-
// For the first instance, allow remoteIp to be null for servers that don't support it natively.
233-
if (currentValues.RemoteIpAndPort != null && checkKnownIps && !CheckKnownAddress(currentValues.RemoteIpAndPort.Address))
234-
{
235-
// Stop at the first unknown remote IP, but still apply changes processed so far.
236-
_logger.LogDebug(1, $"Unknown proxy: {currentValues.RemoteIpAndPort}");
237-
break;
238-
}
234+
// Stop at the first unknown remote IP, but still apply changes processed so far.
235+
_logger.LogDebug(1, $"Unknown proxy: {currentValues.RemoteIpAndPort}");
236+
break;
237+
}
239238

239+
if (checkFor)
240+
{
240241
IPEndPoint parsedEndPoint;
241242
if (IPEndPointParser.TryParse(set.IpAndPortText, out parsedEndPoint))
242243
{

src/Middleware/HttpOverrides/test/ForwardedHeadersMiddlewareTest.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,63 @@ public async Task AllOptionsDisabledRequestDoesntChange()
799799
Assert.Equal("http", context.Request.Scheme);
800800
}
801801

802+
[Theory]
803+
[InlineData(ForwardedHeaders.XForwardedFor, false)]
804+
[InlineData(ForwardedHeaders.XForwardedFor, true)]
805+
[InlineData(ForwardedHeaders.XForwardedHost, false)]
806+
[InlineData(ForwardedHeaders.XForwardedHost, true)]
807+
[InlineData(ForwardedHeaders.XForwardedProto, false)]
808+
[InlineData(ForwardedHeaders.XForwardedProto, true)]
809+
public async Task IgnoreXForwardedHeadersFromUnknownProxy(ForwardedHeaders forwardedHeaders, bool unknownProxy)
810+
{
811+
var builder = new WebHostBuilder()
812+
.Configure(app =>
813+
{
814+
var options = new ForwardedHeadersOptions
815+
{
816+
ForwardedHeaders = forwardedHeaders
817+
};
818+
if (!unknownProxy)
819+
{
820+
var proxy = IPAddress.Parse("10.0.0.1");
821+
options.KnownProxies.Add(proxy);
822+
}
823+
app.UseForwardedHeaders(options);
824+
});
825+
var server = new TestServer(builder);
826+
827+
var context = await server.SendAsync(c =>
828+
{
829+
c.Request.Headers["X-Forwarded-For"] = "11.111.111.11";
830+
c.Request.Headers["X-Forwarded-Host"] = "testhost";
831+
c.Request.Headers["X-Forwarded-Proto"] = "Protocol";
832+
c.Connection.RemoteIpAddress = IPAddress.Parse("10.0.0.1");
833+
c.Connection.RemotePort = 99;
834+
});
835+
836+
if (unknownProxy)
837+
{
838+
Assert.Equal("10.0.0.1", context.Connection.RemoteIpAddress.ToString());
839+
Assert.Equal("localhost", context.Request.Host.ToString());
840+
Assert.Equal("http", context.Request.Scheme);
841+
}
842+
else
843+
{
844+
if (forwardedHeaders.HasFlag(ForwardedHeaders.XForwardedFor))
845+
{
846+
Assert.Equal("11.111.111.11", context.Connection.RemoteIpAddress.ToString());
847+
}
848+
if (forwardedHeaders.HasFlag(ForwardedHeaders.XForwardedHost))
849+
{
850+
Assert.Equal("testhost", context.Request.Host.ToString());
851+
}
852+
if (forwardedHeaders.HasFlag(ForwardedHeaders.XForwardedProto))
853+
{
854+
Assert.Equal("Protocol", context.Request.Scheme);
855+
}
856+
}
857+
}
858+
802859
[Fact]
803860
public async Task PartiallyEnabledForwardsPartiallyChangesRequest()
804861
{

0 commit comments

Comments
 (0)