Dekomprimierung von Anforderungen in ASP.NET Core
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
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
Im folgenden Code werden AddRequestDecompression(IServiceCollection) und UseRequestDecompression verwendet, 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):
- IRequestSizeLimitMetadata.MaxRequestBodySize, z. B. als RequestSizeLimitAttribute oder DisableRequestSizeLimitAttribute für MVC-Endpunkte.
- 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.