Oleh David Acker

Minta middleware dekompresi:

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

Ketika Content-Encoding 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.
  • Menghapus Content-Encoding header, menunjukkan bahwa badan permintaan tidak lagi dikompresi.

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

Dekompresi:

  • Terjadi ketika isi permintaan sedang dibaca. Artinya, dekompresi terjadi pada titik akhir pada pengikatan model. Badan permintaan tidak didekompresi dengan penuh semangat.
  • Saat mencoba membaca badan permintaan yang didekompresi, jika data terkompresi tidak valid untuk yang ditentukan Content-Encodingpengecualian dilemparkan.

Jika middleware menemukan permintaan dengan konten terkompresi tetapi tidak dapat mendekompresnya, permintaan diteruskan ke delegasi berikutnya dalam pipa. Misalnya, permintaan dengan yang tidak didukung Content-Encoding nilai header atau beberapa Content-Encoding nilai header, diteruskan ke delegasi berikutnya dalam pipa. Misalnya, Brotli bisa melempar System.InvalidOperationException: Decoder mengalami data yang tidak valid, Deflate dan GZip dapat melempar System.IO.InvalidDataException: Entri arsip dikompres menggunakan metode kompresi yang tidak didukung.

Konfigurasi

Kode berikut menunjukkan cara mengaktifkan dekompresi permintaan untuk default Content-Encoding jenis:

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

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

Penyedia dekompresi khusus

Dukungan untuk penyandian khusus dapat ditambahkan dengan membuat kelas penyedia dekompresi khusus yang mengimplementasikan IDecompressionProvider:

public class CustomDecompressionProvider : IDecompressionProvider

    public Stream GetDecompressionStream(Stream stream)
    
        // Perform custom decompression logic here
        return stream;
    

Penyedia dekompresi khusus terdaftar dengan RequestDecompressionOptions bersama dengan yang sesuai Content-Encoding nilai tajuk:

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 dari bom zip atau bom dekompresi:

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

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

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, seperti RequestSizeLimitAttribute atau DisableRequestSizeLimitAttribute untuk titik akhir MVC.
  2. Batas ukuran server global IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize dapat diganti per permintaan dengan IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, tetapi default ke batas yang dikonfigurasi untuk implementasi server web.

Peringatan

Menonaktifkan batas ukuran badan permintaan menimbulkan risiko keamanan sehubungan dengan konsumsi sumber daya yang tidak terkendali, terutama jika badan permintaan sedang disangga. Pastikan bahwa perlindungan tersedia untuk mengurangi risiko serangan penolakan layanan (DoS).

Sumber daya tambahan

By AKDSEO