Megosztás a következőn keresztül:


Kérések dekompressziója a ASP.NET Core-ban

Megjegyzés:

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Figyelmeztetés

A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

Készítette: David Acker

Dekompressziós köztes szoftver kérése:

  • Lehetővé teszi, hogy az API-végpontok tömörített tartalommal fogadják el a kéréseket.
  • Content-Encoding A HTTP-fejléc használatával automatikusan azonosítja és kibontja a tömörített tartalmat tartalmazó kérelmeket.
  • Nincs szükség kód írására a tömörített kérések kezeléséhez.

Ha egy Content-Encoding kérelem fejlécértéke megegyezik az elérhető dekompressziós szolgáltatók egyikével, a köztes szoftver:

  • A megfelelő szolgáltatót használja a HttpRequest.Body egy megfelelő dekompressziós adatfolyamba való burkolásához.
  • Eltávolítja a Content-Encoding fejlécet, jelezve, hogy a kérelem törzse már nincs tömörítve.

A fejlécet nem tartalmazó Content-Encoding kéréseket a kérelem dekompressziós köztes szoftver figyelmen kívül hagyja.

Dekompressziós:

  • Akkor fordul elő, ha a kérés törzse beolvasásra kerül. Ez azt jelzi, hogy a dekompresszió a modellkötés végpontján történik. A kérelem törzse nincs azonnal kicsomagolva.
  • Ha a tömörített kérelem törzsét a megadotthoz Content-Encodingérvénytelen tömörített adatokkal próbálja beolvasni, a rendszer kivételt küld. Brotli képes dobni System.InvalidOperationException: Decoder ran into invalid data. és Deflate, valamint GZip képes dobni System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.

Ha a köztes szoftver tömörített tartalommal rendelkező kérést tapasztal, de nem tudja kibontani, a rendszer a kérést a folyamat következő meghatalmazottjának továbbítja. Például egy nem támogatott Content-Encoding fejlécértékkel vagy több Content-Encoding fejlécértékkel rendelkező kérelmet a rendszer a folyamat következő meghatalmazottjának ad át.

Konfiguráció

Az alábbi kód a kérés-dekompressziót engedélyezi az AddRequestDecompression(IServiceCollection)UseRequestDecompression típusokhoz, a és Content-Encoding segítségével.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));

app.Run();

Alapértelmezett dekompressziós szolgáltatók

A Content-Encoding kérelem dekompressziós köztes szoftver által alapértelmezés szerint támogatott fejlécértékek a következő táblázatban találhatók:

Content-Encoding fejlécértékek Description
br Brotli tömörített adatformátum
deflate DEFLATE tömörített adatformátum
gzip Gzip fájlformátum

Egyéni dekompressziós szolgáltatók

Az egyéni kódolások támogatása egyéni dekompressziós szolgáltatói osztályok létrehozásával adható hozzá, amelyek implementálják IDecompressionProvidera következőt:

public class CustomDecompressionProvider : IDecompressionProvider
{
    public Stream GetDecompressionStream(Stream stream)
    {
        // Perform custom decompression logic here
        return stream;
    }
}

Az egyéni dekompressziós szolgáltatók a megfelelő RequestDecompressionOptions fejlécértékekkel Content-Encoding együtt vannak regisztrálva:

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();

Kérelmekre vonatkozó méretkorlátok

A zip bombák vagy dekompressziós bombák elleni védelem érdekében:

  • A tömörített kérelemtörzs maximális mérete a végpont vagy kiszolgáló által kikényszerített kérelemtörzs méretkorlátjára korlátozódik.
  • Ha a tömörített kérelem törzsfolyamából beolvasott bájtok száma meghaladja a korlátot, a rendszer egy InvalidOperationException parancsot küld, amely megakadályozza, hogy további bájtok legyenek beolvasva a streamből.

A végpontok maximális kérésméretét a következő sorrendben állíthatja be:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize RequestSizeLimitAttribute DisableRequestSizeLimitAttribute például MVC-végpontok esetén.
  2. A globális kiszolgáló méretkorlátja IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize kérésenként felülbírálható a IHttpMaxRequestBodySizeFeature.MaxRequestBodySize használatával, de alapértelmezetten a webkiszolgáló implementációjához konfigurált korlátra áll be.
Webkiszolgáló implementálása MaxRequestBodySize konfigurációja
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Figyelmeztetés

A kérelem törzsméretkorlátjának letiltása biztonsági kockázatot jelent az ellenőrizetlen erőforrás-felhasználás tekintetében, különösen akkor, ha a kérelemtörzs pufferelése folyamatban van. Győződjön meg arról, hogy a szolgáltatásmegtagadási (DoS-) támadások kockázatának csökkentése érdekében biztonsági intézkedések vannak érvényben.

További források