使用ImageResizer.net验证图像上传
本文关键字:图像 验证 ImageResizer net 使用 | 更新日期: 2023-09-27 18:25:14
我想知道是否有人能帮忙,大约一周前我发送了ImageResizer和电子邮件,但还没有收到关于我的查询的回复。因此,希望ImageResizer或Stackoverflow成员能够回答我的问题。
我有以下代码。
if (File != null && File.ContentLength > 0)
{
string extension = Path.GetExtension(File.FileName.ToLower());
var imageId = Guid.NewGuid();
if (extension == ".png" || extension== ".jpg" || extension == ".jpeg" || extension == ".gif")
{
var i = new ImageResizer.ImageJob(File, "~/uploads/" + imageId + ".<ext>",
new ImageResizer.ResizeSettings("width=200;height=200;format=png;mode=max"))
{
CreateParentDirectory = false
};
i.Build();
GetValue(model, imageId);
return RedirectToAction("RegisterStepTwo", "Account");
// }
// TempData["WrongImageFormat"] = "Image must be either png, jpeg/jpg or gif";
// return View();
}
TempData["WrongImageFormat"] = "Image must be either png, jpeg/jpg or gif";
return View();
}
上周我在这个网站和其他网站上读到的是,试图验证上传的无效图像,更改文件名,调整大小和更改扩展名。
上面的代码似乎可以做到这一点,我添加了自己的Guid添加到数据库中。如果我在记事本中创建了一个无效的文件,添加javascript并将其保存为png,它将返回以下错误。
[ImageCorruptedException (0x80004005): File may be corrupted, empty, or may contain a PNG image with a single dimension greater than 65,535 pixels.]
所以我的问题是,上面的代码能防止无效的图像上传吗。在阅读了这里的文档和网站上的其他地方后,我找不到我需要的信息。
希望有比我更有经验的人能帮我解决这个问题。
重新编码图像并剥离元数据是确保其不会保留任何恶意内容的最佳方法。ImageResizer默认情况下会执行此操作。
然而,同样重要的是要确保图像数据永远不会被解释为图像以外的任何东西——这意味着控制最终的文件扩展名,并确保它始终提供给具有图像mime类型的客户端。使用ImageResizer的模板路径是一个很好的方法来帮助实现这一点——就像你正在做的那样。永远不要使用上传的文件名。
如果您想将文件扩展名列入白名单,Config.Current.Pipeline.AcceptedImageExtensions
和Config.Current.Pipeline.IsAcceptedImageType(path)
将帮助您确定ImageResizer是否可以支持它们作为源格式。输出格式始终为png、gif、jpeg或webp(如果安装了WebPEncoder),因此如果使用<ext>
路径变量,则不必担心这一点。
您可以简单地使用try{} catch{}
块来捕获任何抛出的ImageCorruptedException
,而不是像现在这样过滤上传文件扩展名。基于文件扩展名阻止上传并不是很有用;最好说该文件不包含有效的图像数据。
此外,很抱歉我们没有收到您上周的电子邮件;在今天之前,我找不到你询问此事的任何记录。