Sdílet prostřednictvím


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:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, například RequestSizeLimitAttribute DisableRequestSizeLimitAttribute pro koncové body MVC.
  2. 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