Как включить сжатие в проекте asp.net Core 2.2 для сайта https и избежать таких проблем, как CRIME и BREACH - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть веб-приложение, написанное на C # поверх платформы ASP.NET Core 2.2 MVC.

Мое приложение отображает множество изображений при каждом запросе, что увеличивает время загрузки и увеличивает использование полосы пропускания.Чтобы улучшить загрузку страницы и использование полосы пропускания, я хочу сжать ответ HTTP, используя форматы Brotli и Gzip .

К счастью, у Microsoft есть пакет, который использует промежуточное ПО для сжатияОтвет HTTP для меня называется Microsoft.AspNetCore.ResponseCompression .Из официальной документации пакета сжатие для защищенных веб-сайтов по умолчанию отключено.

Использование сжатия с динамически генерируемыми страницами может привести к проблемам с безопасностью, таким как CRIME и BREACH атак.

Мой вопрос, как мне сжать ответ, избегая проблем с безопасностью?

Вот как я могу настроить Microsoft.AspNetCore.ResponseCompression пакет

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml", "image/jpeg" });
        options.EnableForHttps = true;
    });

    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseResponseCompression();
    ...
}

Приведенная выше настройка будет применять сжатие для следующих типов MIMI

  • application / javascript
  • application / json
  • application / xml
  • text / css
  • text / html
  • text / json
  • text / plain
  • text / xml
  • image / svg + xml
  • image / jpeg

1 Ответ

0 голосов
/ 25 сентября 2019

Кроме того, вы также можете «сжать» изображение перед отправкой, например, используя:

    private byte[] CompressImageToQuality(System.Drawing.Image image, int quality)
    {
            EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality); 
            ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = qualityParam;
            using (var stream = new System.IO.MemoryStream())
            {
                image.Save(stream, jpegCodec, encoderParams);
                return stream.ToArray();
            }
    }
...