如何防止 ImageSharp Web 调整到特定尺寸?

How to prevent ImageSharp Web from resizing to certain sizes?

我正在使用 ImageSharp.Web 调整我的 ASP.NET Core 5.0 网站上的图像大小。

为了防止 DDoS(分布式拒绝服务攻击),我想限制 ImageSharp.Web 也可以调整的大小。

例如,我有一张原始尺寸为 800x400 (100kb) 的图像,我正在使用以下方法调整其大小:

<img src="image.jpg?width=300&height=300" alt="..." /> // image will be 40 kb, bandwidth saved yay!

问题是如果恶意用户决定请求图像:

<img src="image.jpg?width=8000&height=4000" alt="..." /> // 8,000 x 4,000 => image is now 2mb

如果该用户请求此图像 'high-numbered' 像素大小(7000,7001,7002...8000} 说 10,000 次,服务器将由于内存耗尽和带宽使用而变得无响应。

  1. 如何限制 ImageSharp.Web 不将图像调整到超过原始大小?
  2. 如何限制 ImageSharp.Web 仅将图像调整为例如300x300 和 300x600?

我在 ImageSharp.Web (https://docs.sixlabors.com/articles/imagesharp.web/gettingstarted.html) 中没有看到任何可配置的选项。

我的startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {

        // ....

        services.AddImageSharp();

    }

您要找的地方实际上就在那个页面上。这是 options.OnParseCommandsAsync 函数。

我们实际上做了一些默认清理以帮助减少潜在的攻击向量(并禁止特定的恶意用户),但您可以在那里实施您想要的自定义规则。这是默认方法。

https://github.com/SixLabors/ImageSharp.Web/blob/b72064b3b8cb8b883f8310c86b6d7e5643d80ad3/src/ImageSharp.Web/Middleware/ImageSharpMiddlewareOptions.cs#L20-L44

private Func<ImageCommandContext, Task> onParseCommandsAsync = c => 
{ 
    if (c.Commands.Count == 0) 
    { 
        return Task.CompletedTask; 
    } 

    // It's a good idea to have this to provide very basic security. 
    // We can safely use the static resize processor properties. 
    uint width = c.Parser.ParseValue<uint>( 
        c.Commands.GetValueOrDefault(ResizeWebProcessor.Width), 
        c.Culture); 

    uint height = c.Parser.ParseValue<uint>( 
        c.Commands.GetValueOrDefault(ResizeWebProcessor.Height), 
        c.Culture); 

    if (width > 4000 && height > 4000) 
    { 
        c.Commands.Remove(ResizeWebProcessor.Width); 
        c.Commands.Remove(ResizeWebProcessor.Height); 
    } 

    return Task.CompletedTask; 
};  

然而,这不允许您阻止放大,因为此时我们还没有尝试解码图像,所以对此一无所知。您必须实现自己的 ResizeWebProcessor class 版本( 继承应该没问题,因为它不是密封的 )并覆盖此方法。您可以删除原始文件并按照文档中的说明注册您自己的文件。

https://github.com/SixLabors/ImageSharp.Web/blob/b72064b3b8cb8b883f8310c86b6d7e5643d80ad3/src/ImageSharp.Web/Processors/ResizeWebProcessor.cs#L69-L84

public FormattedImage Process( 
     FormattedImage image, 
     ILogger logger, 
     IDictionary<string, string> commands, 
     CommandParser parser, 
     CultureInfo culture) 
{ 
    ResizeOptions options = GetResizeOptions(commands, parser, culture); 

    if (options != null) 
    { 
        image.Image.Mutate(x => x.Resize(options)); 
    } 

    return image; 
} 

希望说清楚。