2

我想知道是否有人可以提供帮助,大约一周前我发送了 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.]

所以我的问题是,上面的代码是否可以防止无效图像上传。在阅读了此处的文档以及网站上的其他位置后,我找不到所需的信息。

希望比我有更多经验的人可以帮助解决这个问题。

4

1 回答 1

2

重新编码图像并剥离元数据是确保图像不会保留任何恶意内容的最佳方式。ImageResizer 默认执行此操作。

然而,确保图像数据永远不会被解释为图像以外的任何东西同样重要——这意味着控制最终文件扩展名,并确保始终将其提供给具有图像 mime 类型的客户端。使用 ImageResizer 的模板路径是解决此问题的好方法 - 正如您正在做的那样。切勿使用上传的文件名。

如果您想将文件扩展名列入白名单,Config.Current.Pipeline.AcceptedImageExtensions并将Config.Current.Pipeline.IsAcceptedImageType(path)帮助您确定 ImageResizer 是否可以支持它们作为源格式。<ext>输出格式始终为 png、gif、jpeg 或 webp(如果安装了 WebPEncoder),因此如果您使用路径变量,则不必担心这一点。

与其过滤上传文件扩展名,不如简单地使用一个try{} catch{}块来捕获任何抛出ImageCorruptedException的 . 根据文件扩展名阻止上传信息不是很丰富;最好说该文件不包含有效的图像数据。

另外,很抱歉我们上周没有收到您的电子邮件;在今天之前,我找不到任何你问过这个问题的记录。

于 2013-07-29T18:58:58.970 回答