Bagikan melalui


Meminta dekompresi di ASP.NET Core

Oleh David Acker

Meminta middleware dekompresi:

  • Memungkinkan titik akhir API untuk menerima permintaan dengan konten terkompresi.
  • Content-Encoding Menggunakan header HTTP untuk mengidentifikasi dan mendekompresi permintaan secara otomatis yang berisi konten terkompresi.
  • Menghilangkan kebutuhan untuk menulis kode untuk menangani permintaan terkompresi.

Content-Encoding Ketika nilai header pada permintaan cocok dengan salah satu penyedia dekompresi yang tersedia, middleware:

  • Menggunakan penyedia yang cocok untuk membungkus HttpRequest.Body dalam aliran dekompresi yang sesuai.
  • Content-Encoding Menghapus header, menunjukkan bahwa isi permintaan tidak lagi dikompresi.

Permintaan yang tidak menyertakan Content-Encoding header diabaikan oleh middleware dekompresi permintaan.

Dekompresi:

  • Terjadi ketika isi permintaan dibaca. Artinya, dekompresi terjadi di titik akhir pada pengikatan model. Isi permintaan tidak didekompresi dengan bersemangat.
  • Saat mencoba membaca isi permintaan yang didekompresi dengan data terkompresi yang tidak valid untuk yang ditentukan Content-Encoding, pengecualian dilemparkan. Brotli dapat melemparkan System.InvalidOperationException: Decoder ran into invalid data. Deflate dan GZip dapat melemparkan System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.

Jika middleware menemukan permintaan dengan konten terkompresi tetapi tidak dapat mendekompresinya, permintaan diteruskan ke delegasi berikutnya dalam alur. Misalnya, permintaan dengan nilai header yang tidak didukung Content-Encoding atau beberapa Content-Encoding nilai header diteruskan ke delegasi berikutnya dalam alur.

Konfigurasi

Kode berikut menggunakan AddRequestDecompression(IServiceCollection) dan untuk mengaktifkan dekompresi permintaan untuk jenis defaultContent-Encoding:UseRequestDecompression

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

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

app.Run();

Penyedia dekompresi default

Nilai Content-Encoding header yang didukung middleware dekompresi permintaan secara default tercantum dalam tabel berikut:

Content-Encoding nilai header Deskripsi
br Format data terkompresi brotli
deflate Format data terkompresi DEFLATE
gzip Format file Gzip

Penyedia dekompresi kustom

Dukungan untuk pengodean kustom dapat ditambahkan dengan membuat kelas penyedia dekompresi kustom yang mengimplementasikan IDecompressionProvider:

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

Penyedia dekompresi kustom didaftarkan bersama dengan RequestDecompressionOptions nilai header yang Content-Encoding sesuai:

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

Batas ukuran permintaan

Untuk menjaga terhadap bom zip atau bom dekompresi:

  • Ukuran maksimum isi permintaan yang didekompresi terbatas pada batas ukuran isi permintaan yang diberlakukan oleh titik akhir atau server.
  • Jika jumlah byte yang dibaca dari aliran isi permintaan yang didekompresi melebihi batas, InvalidOperationException dilemparkan untuk mencegah byte tambahan dibaca dari aliran.

Dalam urutan prioritas, ukuran permintaan maksimum untuk titik akhir diatur oleh:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, seperti RequestSizeLimitAttribute atau DisableRequestSizeLimitAttribute untuk titik akhir MVC.
  2. Batas IHttpMaxRequestBodySizeFeature.MaxRequestBodySizeukuran server global . MaxRequestBodySize dapat ditimpa per permintaan dengan IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, tetapi default ke batas yang dikonfigurasi untuk implementasi server web.
Implementasi server web MaxRequestBodySize konfigurasi
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Peringatan

Menonaktifkan batas ukuran isi permintaan menimbulkan risiko keamanan sehubungan dengan konsumsi sumber daya yang tidak terkendali, terutama jika isi permintaan sedang di-buffer. Pastikan bahwa perlindungan diberlakukan untuk mengurangi risiko serangan denial-of-service (DoS).

Sumber Tambahan