Dekomprese požadavků v ASP.NET Core
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 ).
Další materiály
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro