我正在使用ImageSharp.Web调整我的ASP.NET核心5.0网站上的图片大小。
为了防止DDoS (分布式拒绝服务攻击),我也想限制ImageSharp.Web可以调整大小的大小。
例如,我有一个原始大小为800x400 (100 am )的图像,我正在使用以下方法调整大小:
<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次--服务器将因内存耗尽和带宽占用而失去响应。
在ImageSharp.Web (https://docs.sixlabors.com/articles/imagesharp.web/gettingstarted.html)中,我看不到任何可配置的选项。
我的startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ....
services.AddImageSharp();
}发布于 2021-02-20 14:42:10
你要找的地方实际上就在那页上。这是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类(继承应该很好,因为它不是密封的)并覆盖这个方法。您可以删除原始文件并按照文档中的说明注册自己的文档。
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;
} 希望这能说明问题。
https://stackoverflow.com/questions/66284106
复制相似问题