Solicitar descompactação no ASP.NET Core

Por David Acker

Solicitar middleware de descompactação:

  • Permite que os pontos de extremidade de API aceitem solicitações com conteúdo compactado.
  • Usa o cabeçalho HTTP Content-Encoding para identificar e descompactar automaticamente solicitações que contêm conteúdo compactado.
  • Elimina a necessidade de gravar código para manipular solicitações compactadas.

Quando o valor do cabeçalho Content-Encoding em uma solicitação corresponde a um dos provedores de descompactação disponíveis, o middleware:

  • Usa o provedor correspondente para encapsular o HttpRequest.Body em um fluxo de descompactação apropriado.
  • Remove o cabeçalho Content-Encoding, indicando que o corpo da solicitação não está mais compactado.

As solicitações que não incluem um cabeçalho Content-Encoding são ignoradas pelo middleware de descompactação da solicitação.

Descompactação:

  • Ocorre quando o corpo da solicitação é lido. Ou seja, a descompactação ocorre no ponto de extremidade na associação de modelo. O corpo da solicitação não é descompactado rapidamente.
  • Ao tentar ler o corpo da solicitação descompactado com dados compactados inválidos para o Content-Encoding especificado, uma exceção é gerada. Brotli pode gerar System.InvalidOperationException: Deflate e GZip Decoder ran into invalid data. podem gerar System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.

Se o middleware encontrar uma solicitação com conteúdo compactado, mas não puder descompactá-la, a solicitação será passada para o próximo representante no pipeline. Por exemplo, uma solicitação com um valor de cabeçalho Content-Encoding sem suporte ou com vários valores de cabeçalho Content-Encoding é passada para o próximo representante no pipeline.

Configuração

O seguinte código usa AddRequestDecompression(IServiceCollection) e UseRequestDecompression para habilitar a descompactação de solicitação para os tipos padrãoContent-Encoding:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRequestDecompression();

var app = builder.Build();

app.UseRequestDecompression();

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

app.Run();

Provedores de descompactação padrão

OsContent-Encoding valores de cabeçalho aos quais o middleware de descompactação de solicitação dá suporte por padrão estão listados na tabela a seguir:

Valores do cabeçalho Content-Encoding Descrição
br Formato de dados compactados Brotli
deflate Formato de dados compactados DEFLATE
gzip Formato de arquivo Gzip

Provedores de descompactação personalizados

O suporte para codificações personalizadas pode ser adicionado criando classes de provedor de descompactação personalizadas que implementam IDecompressionProvider:

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

Os provedores de descompactação personalizados são registrados com RequestDecompressionOptions juntamente com seus valores de cabeçalho correspondentes Content-Encoding:

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

Limites de tamanho de solicitação

Para se proteger contra bombas zip ou bombas de descompactação:

  • O tamanho máximo do corpo de solicitação descompactado é limitado ao limite de tamanho do corpo da solicitação imposto pelo ponto de extremidade ou servidor.
  • Se o número de bytes lidos do fluxo do corpo da solicitação descompactado exceder o limite, uma InvalidOperationException será gerada para impedir que bytes adicionais sejam lidos do fluxo.

Em ordem de precedência, o tamanho máximo da solicitação para um ponto de extremidade é definido por:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, como RequestSizeLimitAttribute ou DisableRequestSizeLimitAttribute para pontos de extremidade MVC.
  2. O limite de tamanho do servidor global IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize pode ser substituído por solicitação com IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, mas o padrão é o limite configurado para a implementação do servidor Web.
Uma implementação do servidor Web Configuração de MaxRequestBodySize
HTTP.sys HttpSysOptions.MaxRequestBodySize
IIS IISServerOptions.MaxRequestBodySize
Kestrel KestrelServerLimits.MaxRequestBodySize

Aviso

Desabilitar o limite de tamanho do corpo da solicitação representa um risco de segurança em relação ao consumo de recursos não controlado, especialmente se o corpo da solicitação estiver sendo armazenado em buffer. Certifique-se de que as proteções estejam em vigor para atenuar o risco de ataques de negação de serviço (DoS, na sigla em inglês).

Recursos adicionais