ASP.NET Core'da sıkıştırmayı açma isteği

Tarafından David Acker

Sıkıştırmayı kaldırma ara yazılımını isteme:

  • API uç noktalarının sıkıştırılmış içeriğe sahip istekleri kabul etmelerini sağlar.
  • Content-Encoding Sıkıştırılmış içerik içeren istekleri otomatik olarak tanımlamak ve sıkıştırmasını açmak için HTTP üst bilgisini kullanır.
  • Sıkıştırılmış istekleri işlemek için kod yazma gereksinimini ortadan kaldırır.

bir istekte Content-Encoding üst bilgi değeri kullanılabilir sıkıştırmayı açma sağlayıcılarından biriyle eşleştiğinde ara yazılım:

  • Uygun bir dekompresyon akışına sarmak için eşleşen sağlayıcıyı HttpRequest.Body kullanır.
  • İstek gövdesinin Content-Encoding artık sıkıştırılmadığını belirten üst bilgiyi kaldırır.

Üst bilgi içermeyen Content-Encoding istekler, istek sıkıştırma ara yazılımı tarafından yoksayılır.

Dekompresyon:

  • İsteğin gövdesi okunduğunda gerçekleşir. Yani, model bağlaması üzerindeki uç noktada sıkıştırma oluşur. İstek gövdesi hevesle açılmıyor.
  • Belirtilen Content-Encodingiçin geçersiz sıkıştırılmış verilerle sıkıştırılmış istek gövdesini okumaya çalışırken bir özel durum oluşur. Brotli atabilir System.InvalidOperationException: Decoder ran into invalid data. Deflate ve GZip atabilir System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.

Ara yazılım sıkıştırılmış içeriğe sahip bir istekle karşılaşır ancak sıkıştırmasını açamazsa, istek işlem hattındaki bir sonraki temsilciye geçirilir. Örneğin, desteklenmeyen Content-Encoding üst bilgi değerine veya birden çok Content-Encoding üst bilgi değerine sahip bir istek, işlem hattındaki bir sonraki temsilciye geçirilir.

Yapılandırma

Aşağıdaki kod, varsayılanContent-Encoding türler için isteğin sıkıştırmasını kaldırmayı etkinleştirmek için ve UseRequestDecompression kullanırAddRequestDecompression(IServiceCollection):

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

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

app.Run();

Varsayılan dekompresyon sağlayıcıları

İstek Content-Encoding sıkıştırma ara yazılımının varsayılan olarak desteklediği üst bilgi değerleri aşağıdaki tabloda listelenmiştir:

Content-Encoding üst bilgi değerleri Açıklama
br Brotli sıkıştırılmış veri biçimi
deflate DEFLATE sıkıştırılmış veri biçimi
gzip Gzip dosya biçimi

Özel dekompresyon sağlayıcıları

özel kodlama desteği, uygulayan IDecompressionProviderözel sıkıştırma sağlayıcı sınıfları oluşturularak eklenebilir:

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

Özel sıkıştırma kaldırma sağlayıcıları, ilgili Content-Encoding üst bilgi değerleriyle RequestDecompressionOptions birlikte kaydedilir:

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

İstek boyutu sınırları

Posta bombalarına veya dekompresyon bombalarına karşı korunmak için:

  • Sıkıştırılmış istek gövdesinin en büyük boyutu, uç nokta veya sunucu tarafından zorunlu kılınan istek gövdesi boyut sınırıyla sınırlıdır.
  • Sıkıştırılmış istek gövdesi akışından okunan bayt sayısı sınırı aşarsa, ek baytların akıştan okunmasını önlemek için invalidOperationException oluşturulur.

Öncelik sırasına göre, bir uç nokta için en büyük istek boyutu şu şekilde ayarlanır:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, örneğin RequestSizeLimitAttribute MVC DisableRequestSizeLimitAttribute uç noktaları için.
  2. Genel sunucu boyutu sınırı IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize ile IHttpMaxRequestBodySizeFeature.MaxRequestBodySizeistek başına geçersiz kılınabilir, ancak varsayılan olarak web sunucusu uygulaması için yapılandırılan sınıra sahiptir.
Web sunucusu uygulaması MaxRequestBodySize yapılandırması
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Uyarı

İstek gövdesi boyutu sınırının devre dışı bırakılması, özellikle istek gövdesi arabelleğe alınıyorsa, denetimsiz kaynak tüketimi açısından bir güvenlik riski oluşturur. Hizmet reddi (DoS) saldırı riskini azaltmak için güvenlik önlemlerinin sağlandığından emin olun.

Ek Kaynaklar