Dekomprimierung von Anforderungen in ASP.NET Core

Von David Acker

Middleware zum Dekomprimieren von Anforderungen:

  • Ermöglicht API-Endpunkten die Annahme von Anforderungen mit komprimierten Inhalten.
  • Verwendet den Content-Encoding-HTTP-Header, um Anforderungen, die komprimierten Inhalt enthalten, automatisch zu identifizieren und zu dekomprimieren.
  • Damit ist es nicht mehr notwendig, Code zum Behandeln komprimierter Anforderungen zu schreiben.

Wenn der Content-Encoding-Headerwert einer Anforderung mit einem der verfügbaren Dekomprimierungsanbieter übereinstimmt, führt die Middleware folgende Aktionen aus:

  • Verwenden des passenden Anbieters, um den HttpRequest.Body ein einem geeigneten Dekomprimierungsstream zu umschließen
  • Entfernen des Content-Encoding-Headers, um anzugeben, dass der Anforderungstext nicht mehr komprimiert ist.

Anforderungen, die keinen Content-Encoding-Header enthalten, werden von der Middleware zum Dekomprimieren von Anforderungen ignoriert.

Dekomprimierung:

  • Tritt auf, wenn der Anforderungstext gelesen wird. Das heißt, die Dekomprimierung tritt am Endpunkt bei der Modellbindung auf. Der Anforderungstext wird nicht vorab dekomprimiert.
  • Beim Versuch, den dekomprimierten Anforderungstext zu lesen, wird eine Ausnahme ausgelöst, wenn die komprimierten Daten für den angegebenen Content-Encoding ungültig sind. Brotli kann System.InvalidOperationException auswerfen :Decoder ran into invalid data. Deflate und GZip können System.IO.InvalidDataException auswerfen : The archive entry was compressed using an unsupported compression method.

Wenn die Middleware auf eine Anforderung mit komprimiertem Inhalt stößt, die sie nicht dekomprimieren kann, wird die Anforderung an den nächsten Delegaten in der Pipeline übergeben. Beispielsweise wird eine Anforderung mit einem nicht unterstützten Content-Encoding-Headerwert oder mehreren Content-Encoding-Headerwerten an den nächsten Delegaten in der Pipeline übergeben.

Konfiguration

Der folgende Code verwendet AddRequestDecompression(IServiceCollection) und UseRequestDecompression, um die Dekomprimierung von Anforderungen für die Content-Encoding-Standardtypen zu aktivieren:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

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

app.Run();

Standardanbieter für die Dekomprimierung

Die Content-Encoding-Headerwerte, die von der Middleware für die Dekomprimierung von Anforderungen standardmäßig unterstützt werden, sind in der folgenden Tabelle aufgeführt:

Content-Encoding-Headerwerte BESCHREIBUNG
br Mit Brotli komprimiertes Datenformat
deflate Mit DEFLATE komprimiertes Datenformat
gzip Gzip-Dateiformat

Benutzerdefinierte Anbieter für die Dekomprimierung

Sie können Unterstützung für benutzerdefinierte Codierungen hinzufügen, indem Sie Klassen für benutzerdefinierte Dekomprimierungsanbieter erstellen, die IDecompressionProvider implementieren:

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

Benutzerdefinierte Dekomprimierungsanbieter werden mit RequestDecompressionOptions und zusammen mit ihren entsprechenden Content-Encoding-Headerwerten registriert:

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();

Anforderungsgrößenlimits

Zum Schutz vor ZIP- oder Dekomprimierungsbomben:

  • Die maximale Größe des dekomprimierten Anforderungstexts ist auf die vom Endpunkt oder Server erzwungene Anforderungstextgröße beschränkt.
  • Wenn die Anzahl der vom Datenstrom mit dem zu dekomprimierenden Anforderungstext gelesenen Bytes den Grenzwert überschreitet, wird eine InvalidOperationException ausgelöst, um zu verhindern, dass zusätzliche Bytes aus dem Datenstrom gelesen werden.

Die maximale Anforderungsgröße für einen Endpunkt wird durch Folgendes festgelegt (in der Rangfolge):

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, z. B. als RequestSizeLimitAttribute oder DisableRequestSizeLimitAttribute für MVC-Endpunkte.
  2. Die Größenbeschränkung des globalen Servers IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize kann anforderungsweise mit IHttpMaxRequestBodySizeFeature.MaxRequestBodySize außer Kraft gesetzt werden. Der Wert wird jedoch standardmäßig auf den für die Webanwendungsimplementierung konfigurierten Grenzwert festgelegt.
Webserverimplementierung MaxRequestBodySize-Konfiguration
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Warnung

Das Deaktivieren des Grenzwerts für die Anforderungstextgröße stellt ein Sicherheitsrisiko in Bezug auf den nicht kontrollierten Ressourcenverbrauch dar, insbesondere, wenn der Anforderungstext gepuffert wird. Stellen Sie sicher, dass Sicherheitsvorkehrungen getroffen werden, um das Risiko von Denial-of-Service-Angriffen (DoS) zu verringern.

Weitere Ressourcen