1

我有一个简单的表格:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data" }))
{
    <input type="file" name="image" />
    <br />
    <input type="submit" value="Upload" />
}

我要发布到:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        // All necessary validation logic here
    }

    return RedirectToAction("Index");
}

我正在尝试将上传的文件限制为 jpeg、png 和 gif 格式。我无法限制上传图像的最小和最大宽度和高度以及图像文件大小。

我想我可以通过简单地将if语句更改为:

if (file.ContentLength > 0 && file.ContentLength < maxUploadSize)

我知道如何检查上传文件的扩展名,但我更愿意检查它的 mime-type/header。

问题

鉴于上面的示例代码,我如何正确验证上传的文件?我想确保该文件是:

  • JPEG、GIF 或 PNG 文件(检查文件扩展名和文件头)
  • 不大于最大上传大小(文件大小)
  • 预定义限制内的尺寸(宽度/高度)
4

1 回答 1

1

正如您所说,您应该只通过文件扩展名验证图像类型。由于请求标头可以伪造,因此不可靠。

要获得最大上传大小,您需要根据需要更新 web.config 或 machine.config - 应用程序级别或机器级别。

对于 IIS6:

<location path="upload">
  <system.web>
    <httpRuntime maxRequestLength="xxx" />
  </system.web>
</location>

对于 IIS7: http: //support.microsoft.com/kb/942074/

至于验证尺寸,您必须读取图像并检查其width和属性,这是在内存中执行height此操作的构造函数位图类。如果您想先将图像保存到文件中,请使用这个.

细则:增加此值可能会使您成为拒绝服务 (DOS) 攻击的受害者,如此处所述

安防措施:

  • 目前我能想到的一个解决方法是设置另一台服务器/机器来处理文件上传,这样你的主 Web 服务器就不会受到影响。
  • 用于<location path="my-upload-path">将此设置应用于单个位置。
  • 考虑使用HttpHandler 或 HttpModule来处理上传。

一旦我有比这更好的解决方案,我会更新我的答案。

于 2012-05-21T00:28:58.380 回答