Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
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-EncodingHTTP 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 RequestSizeLimitAttributeDisableRequestSizeLimitAttribute pro koncové body MVC.
- Globální limit IHttpMaxRequestBodySizeFeature.MaxRequestBodySizevelikosti serveru .
MaxRequestBodySizelze 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 ).