AspNetCoreRateLimit
AspNetCoreRateLimit copied to clipboard
Invalid IPs are causing exceptions
A request with
X-Forwarded-For : '{${print(9347655345-4954366)}}'
caused
An invalid IP address was specified.
at System.Net.IPAddressParser.Parse(ReadOnlySpan`1 ipSpan, Boolean tryParse)
at System.Net.IPAddress.Parse(String ipString)
at AspNetCoreRateLimit.IpAddressUtil.ParseIp(String ipAddress) in C:\Users\User\Documents\Github\AspNetCoreRateLimit\src\AspNetCoreRateLimit\Net\IpAddressUtil.cs:line 83
at AspNetCoreRateLimit.IpHeaderResolveContributor.ResolveIp(HttpContext httpContext) in C:\Users\User\Documents\Github\AspNetCoreRateLimit\src\AspNetCoreRateLimit\Resolvers\IpHeaderResolveContributor.cs:line 19
at AspNetCoreRateLimit.RateLimitMiddleware`1.ResolveIdentityAsync(HttpContext httpContext) in C:\Users\User\Documents\Github\AspNetCoreRateLimit\src\AspNetCoreRateLimit\Middleware\RateLimitMiddleware.cs:line 149
at AspNetCoreRateLimit.RateLimitMiddleware`1.Invoke(HttpContext context) in C:\Users\User\Documents\Github\AspNetCoreRateLimit\src\AspNetCoreRateLimit\Middleware\RateLimitMiddleware.cs:line 41
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
...
Here's a workaround.
public class XForwardedForCheckerMiddleware
{
private readonly RequestDelegate _next;
public XForwardedForCheckerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, ILogger<XForwardedForCheckerMiddleware> logger)
{
if (context.Request.Headers.ContainsKey("X-Forwarded-For"))
{
string xff = context.Request.Headers["X-Forwarded-For"];
if (!string.IsNullOrEmpty(xff))
{
if (xff.Split(',').Any(z => !IPAddress.TryParse(z.Trim(), out IPAddress _)))
{
context.Response.StatusCode = 400; // Bad request.
logger.LogWarning("Request rejected (400) because of invalid IP address in header X-Forwarded-For.");
return;
}
}
}
await _next.Invoke(context);
}
}
Hopefully we can switch to net7 soon; that's likely to be less unreliable.