ASP.NET Core'da sıkıştırmayı açma isteği
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
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-Encoding
iç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ılan Content-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ı
Zip bombalarına veya dekompresyon bombalarına karşı korumak 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:
- IRequestSizeLimitMetadata.MaxRequestBodySize, örneğin RequestSizeLimitAttribute MVC DisableRequestSizeLimitAttribute uç noktaları için.
- 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
ASP.NET Core