0

我正在使用 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

如果该用户请求此图像具有“高编号”像素大小(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();

    }
4

1 回答 1

1

您正在寻找的地方实际上是在该页面上。就是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类版本(继承应该没问题,因为它不是密封的)并覆盖此方法。您可以删除原始文件并按照文档中的说明注册自己的文件。

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; 
} 

希望这说明清楚。

于 2021-02-20T14:42:10.880 回答