Begär dekomprimering i ASP.NET Core

Anmärkning

Det här är inte den senaste versionen av den här artikeln. Den aktuella versionen finns i .NET 10-versionen av den här artikeln.

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av David Acker

Begäran om dekomprimeringsmellanmjukvara

  • Gör att API-slutpunkter kan acceptera begäranden med komprimerat innehåll.
  • Använder Content-Encoding HTTP-huvud för att automatiskt identifiera och dekomprimera begäranden som innehåller komprimerat innehåll.
  • Eliminerar behovet av att skriva kod för att hantera komprimerade begäranden.

Content-Encoding När header-värdet på en begäran matchar en av de tillgängliga dekomprimeringsleverantörerna, gör mellanvaran följande:

  • Använder matchande leverantörer för att omsluta HttpRequest.Body i en lämplig dekomprimeringsström.
  • Tar bort Content-Encoding-huvudet, som indikerar att begärandetexten inte längre är komprimerad.

Begäranden som inte innehåller ett Content-Encoding huvud ignoreras av mellanprogrammet för begärandekomprimering.

Dekompression:

  • Inträffar när brödtexten i begäran läss. D.v.s. dekomprimering sker vid slutpunkten för modellbindningen. Begärandetexten dekomprimeras inte omedelbart.
  • När du försöker läsa den komprimerade begärandetexten med ogiltiga komprimerade data för den angivna Content-Encodinggenereras ett undantag. Brotli kan kasta System.InvalidOperationException: Decoder ran into invalid data. Deflate och GZip kan kasta System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.

Om mellanprogrammet påträffar en begäran med komprimerat innehåll men inte kan dekomprimeras skickas begäran till nästa ombud i pipelinen. Till exempel skickas en begäran med ett Content-Encoding huvudvärde som inte stöds eller flera Content-Encoding huvudvärden till nästa delegerade i pipelinen.

Konfiguration

Följande kod använder AddRequestDecompression(IServiceCollection) och UseRequestDecompression för att aktivera dekomprimering av begäran för standardtypernaContent-Encoding :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));

app.Run();

Standardprovidrar för dekomprimering

De Content-Encoding rubrikvärden som mellanprogrammet för begärandekomprimering stöder som standard visas i följande tabell:

Content-Encoding rubrikvärden Description
br Brotli-komprimerat dataformat
deflate DEFLATE-komprimerat dataformat
gzip Gzip-filformat

Anpassade dekomprimeringsleverantörer

Stöd för anpassade kodningar kan läggas till genom att skapa anpassade dekomprimeringsproviderklasser som implementerar IDecompressionProvider:

public class CustomDecompressionProvider : IDecompressionProvider
{
    public Stream GetDecompressionStream(Stream stream)
    {
        // Perform custom decompression logic here
        return stream;
    }
}

Anpassade dekomprimeringsprovidrar registreras med RequestDecompressionOptions och deras motsvarande Content-Encoding huvudvärden.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression(options =>
{
    options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
});

var app = builder.Build();

app.UseRequestDecompression();

app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));

app.Run();

Storleksgränser för begäran

För att skydda mot zip-bomber eller dekomprimeringsbomber:

  • Den maximala storleken på den komprimerade begärandetexten är begränsad till den storleksgräns för begärandetext som tillämpas av slutpunkten eller servern.
  • Om antalet byte som läses från den komprimerade brödtextströmmen för begäran överskrider gränsen genereras en InvalidOperationException för att förhindra att ytterligare byte läses från strömmen.

I prioritetsordning anges den maximala begärandestorleken för en slutpunkt av:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, till exempel RequestSizeLimitAttribute eller DisableRequestSizeLimitAttribute för MVC-slutpunkter.
  2. Den globala serverstorleksgränsen IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize kan åsidosättas vid varje begäran med IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, men standardvärdet är den gräns som konfigurerats för webbserverimplementeringen.
Implementering av webbserver MaxRequestBodySize konfiguration
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS (IIS) IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Varning

Om du inaktiverar storleksgränsen för begärandetexten utgör det en säkerhetsrisk när det gäller okontrollerad resursförbrukning, särskilt om begärandetexten buffrades. Se till att skyddsåtgärder finns på plats för att minska risken för doS-attacker (Denial-of-Service ).

Ytterligare resurser