Dekomprese požadavků v ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Autor: David Acker
Middleware dekomprese požadavku:
- Umožňuje koncovým bodům rozhraní API přijímat požadavky s komprimovaným obsahem.
- Používá hlavičku
Content-Encoding
HTTP k automatické identifikaci a dekomprimaci požadavků, které obsahují komprimovaný obsah. - Eliminuje potřebu psát kód pro zpracování komprimovaných požadavků.
Pokud hodnota hlavičky Content-Encoding
v požadavku odpovídá jednomu z dostupných poskytovatelů dekomprese, middleware:
- Použije odpovídajícího zprostředkovatele k zabalení příslušného dekomprimačního datového HttpRequest.Body proudu.
- Odebere hlavičku
Content-Encoding
, která značí, že tělo požadavku už není komprimované.
Požadavky, které neobsahují hlavičku Content-Encoding
, jsou ignorovány middlewarem dekomprese požadavku.
Dekomprese:
- Nastane, když se přečte text požadavku. To znamená, že dekomprese probíhá v koncovém bodu vazby modelu. Tělo požadavku není dekomprimováno dychtivě.
- Při pokusu o čtení dekomprimovaného textu požadavku s neplatnými komprimovanými daty pro zadané
Content-Encoding
, je vyvolána výjimka. Brotli může vyvolat System.InvalidOperationException: Decoder ran into invalid data. Deflate a GZip může vyvolat System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.
Pokud middleware narazí na požadavek s komprimovaným obsahem, ale nemůže ho dekomprimovat, požadavek se předá dalšímu delegátu v kanálu. Například požadavek s nepodporovanou Content-Encoding
hodnotou hlavičky nebo více Content-Encoding
hodnot hlaviček se předá dalšímu delegátu v kanálu.
Konfigurace
Následující kód používá AddRequestDecompression(IServiceCollection) a UseRequestDecompression umožňuje dekompresi požadavku pro výchozí Content-Encoding
typy:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression();
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();
Výchozí zprostředkovatelé dekomprese
Hodnoty Content-Encoding
hlaviček, které middleware dekomprese požadavku podporuje ve výchozím nastavení, jsou uvedeny v následující tabulce:
Content-Encoding hodnoty záhlaví |
Popis |
---|---|
br |
Komprimovaný formát dat Brotli |
deflate |
DEFLATE komprimovaný formát dat |
gzip |
Formát souboru Gzip |
Vlastní zprostředkovatelé dekomprese
Podporu vlastních kódování lze přidat vytvořením vlastních tříd zprostředkovatele dekomprese, které implementují IDecompressionProvider:
public class CustomDecompressionProvider : IDecompressionProvider
{
public Stream GetDecompressionStream(Stream stream)
{
// Perform custom decompression logic here
return stream;
}
}
Vlastní zprostředkovatelé dekomprese se registrují RequestDecompressionOptions spolu s odpovídajícími Content-Encoding
hodnotami záhlaví:
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();
Limity velikosti požadavků
Za účelem ochrany proti zip bombám nebo dekompresím bomb:
- Maximální velikost dekomprimovaného textu požadavku je omezená na omezení velikosti textu požadavku vynucené koncovým bodem nebo serverem.
- Pokud počet bajtů přečtených z dekomprimovaného datového proudu textu požadavku překročí limit, vyvolá se výjimka InvalidOperationException , aby se zabránilo čtení dalších bajtů z datového proudu.
V pořadí podle priority je maximální velikost požadavku pro koncový bod nastavená takto:
- IRequestSizeLimitMetadata.MaxRequestBodySize, například RequestSizeLimitAttribute DisableRequestSizeLimitAttribute pro koncové body MVC.
- Globální limit IHttpMaxRequestBodySizeFeature.MaxRequestBodySizevelikosti serveru .
MaxRequestBodySize
lze přepsat na požadavek pomocí IHttpMaxRequestBodySizeFeature.MaxRequestBodySizeparametru , ale ve výchozím nastavení se nastaví limit nakonfigurovaný pro implementaci webového serveru.
Implementace webového serveru | Konfigurace MaxRequestBodySize |
---|---|
HTTP.sys | HttpSysOptions.MaxRequestBodySize |
IIS | IISServerOptions.MaxRequestBodySize |
Kestrel | KestrelServerLimits.MaxRequestBodySize |
Upozorňující
Zakázání limitu velikosti těla požadavku představuje bezpečnostní riziko, pokud jde o nekontrolovatelnou spotřebu prostředků, zejména pokud je tělo požadavku uloženo do vyrovnávací paměti. Zajistěte, aby byla zajištěna ochrana, aby se zmírnit riziko útoků doS (DoS ).