Harden image URL validation against followed redirects
This commit is contained in:
@@ -122,6 +122,8 @@ internal static class EndpointHelpers
|
||||
{
|
||||
using var head = new HttpRequestMessage(HttpMethod.Head, uri);
|
||||
var headResp = await client.SendAsync(head, HttpCompletionOption.ResponseHeadersRead, cts.Token);
|
||||
if (WasRedirected(uri, headResp))
|
||||
return false;
|
||||
if (headResp is { IsSuccessStatusCode: true, StatusCode: not System.Net.HttpStatusCode.Redirect })
|
||||
{
|
||||
if (headResp.Content.Headers.ContentLength is > MaxImageBytes)
|
||||
@@ -142,6 +144,8 @@ internal static class EndpointHelpers
|
||||
using var get = new HttpRequestMessage(HttpMethod.Get, uri);
|
||||
get.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(0, 1023);
|
||||
var resp = await client.SendAsync(get, HttpCompletionOption.ResponseHeadersRead, cts.Token);
|
||||
if (WasRedirected(uri, resp))
|
||||
return false;
|
||||
if (!resp.IsSuccessStatusCode)
|
||||
return false;
|
||||
if (resp.StatusCode is System.Net.HttpStatusCode.Redirect)
|
||||
@@ -179,6 +183,15 @@ internal static class EndpointHelpers
|
||||
|
||||
private const long MaxImageBytes = 5 * 1024 * 1024; // 5 MB guard
|
||||
|
||||
private static bool WasRedirected(Uri requestedUri, HttpResponseMessage response)
|
||||
{
|
||||
var finalUri = response.RequestMessage?.RequestUri;
|
||||
if (finalUri is null)
|
||||
return false;
|
||||
|
||||
return !requestedUri.Equals(finalUri);
|
||||
}
|
||||
|
||||
private static async Task<bool> IsSafePublicHostAsync(Uri uri, CancellationToken ct)
|
||||
{
|
||||
try
|
||||
|
||||
Reference in New Issue
Block a user