首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止ImageSharp网站调整到特定大小?

如何防止ImageSharp网站调整到特定大小?
EN

Stack Overflow用户
提问于 2021-02-19 19:47:55
回答 1查看 595关注 0票数 0

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

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

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

代码语言:javascript
复制
<img src="image.jpg?width=300&height=300" alt="..." /> // image will be 40 kb, bandwidth saved yay!

问题是,如果一个邪恶的用户决定用以下方式请求该图像:

代码语言:javascript
复制
<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

代码语言:javascript
复制
    public void ConfigureServices(IServiceCollection services)
    {

        // ....

        services.AddImageSharp();

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 14:42:10

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

我们实际上做了一些默认的卫生措施,以帮助减少潜在的攻击向量(并且不允许特定的邪恶用户),但是您可以实现您想要的自定义规则。这是默认的方法。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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; 
} 

希望这能说明问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66284106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档