如何防止 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 次,服务器将由于内存耗尽和带宽使用而变得无响应。
- 如何限制 ImageSharp.Web 不将图像调整到超过原始大小?
- 如何限制 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
函数。
我们实际上做了一些默认清理以帮助减少潜在的攻击向量(并禁止特定的恶意用户),但您可以在那里实施您想要的自定义规则。这是默认方法。
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 版本( 继承应该没问题,因为它不是密封的 )并覆盖此方法。您可以删除原始文件并按照文档中的说明注册您自己的文件。
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;
}
希望说清楚。
我正在使用 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 次,服务器将由于内存耗尽和带宽使用而变得无响应。
- 如何限制 ImageSharp.Web 不将图像调整到超过原始大小?
- 如何限制 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
函数。
我们实际上做了一些默认清理以帮助减少潜在的攻击向量(并禁止特定的恶意用户),但您可以在那里实施您想要的自定义规则。这是默认方法。
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 版本( 继承应该没问题,因为它不是密封的 )并覆盖此方法。您可以删除原始文件并按照文档中的说明注册您自己的文件。
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;
}
希望说清楚。