我想知道是否有人可以提供帮助,我在一周前发送了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.]
所以我的问题是,上面的代码是否可以防止无效的图片上传。阅读了文档here以及网站上我无法找到所需信息的地方。
希望有比我更多经验的人可以帮助解决这个问题。
答案 0 :(得分:1)
重新编码图像并删除元数据是确保其无法保留任何恶意内容的最佳方法。 ImageResizer默认执行此操作。
但是,确保图像数据永远不会被解释为图像以外的任何内容同样重要 - 这意味着控制最终的文件扩展名,并确保始终将图像数据提供给具有图像mime类型的客户端。使用ImageResizer的模板路径是一种很好的方法来帮助解决这个问题 - 正如您所做的那样。切勿使用上传的文件名。
如果您想将文件扩展名列入白名单,Config.Current.Pipeline.AcceptedImageExtensions
和Config.Current.Pipeline.IsAcceptedImageType(path)
将帮助您确定ImageResizer是否可以将其作为源格式支持。输出格式始终是png,gif,jpeg或webp(如果安装了WebPEncoder),因此如果您使用<ext>
路径变量,则不必担心。
您可以简单地使用try{} catch{}
块来捕获任何抛出的ImageCorruptedException
,而不是像您一样过滤上传文件扩展名。根据文件扩展名阻止上传不是很有用;最好说文件不包含有效的图像数据。
另外,对不起,我们上周没收到你的电子邮件;在今天之前我找不到你的任何记录。