【问题标题】:Validating an uploaded file's ContentType in ASP.NET在 ASP.NET 中验证上传文件的 ContentType
【发布时间】:2010-09-22 23:01:18
【问题描述】:

我在我的数据库中存储了一些文件,因为我以二进制格式存储它们并且不保留任何其他信息,所以我必须确保它们都采用相同的格式,以便我能够稍后“提供”它们(如果有 简单 方法可以从字节数组推断文件类型,请告知,但这不是这里的重点)。

所以,我需要做的是验证上传的每个文件,以确保其格式符合要求。

我设置了一个带有 FileUpload 控件和 CustomValidator 的 FieldTemplate:

<asp:FileUpload ID="FileUpload" runat="server" />&nbsp;


<asp:CustomValidator
    ID="CustomValidator1"
    runat="server"
    ErrorMessage="PDF only."
    ControlToValidate="FileUpload"
    OnServerValidate="CustomValidator1_ServerValidate">
</asp:CustomValidator>

我缺少的是放置在 CustomValidator1_ServerValidate 方法中的代码,该方法检查上传的文件以确保其格式正确(在本例中为 PDF)。

提前致谢。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    使用 FileUpload.PostedFile.ContentType 属性来验证 MIME 类型(应该是 application/pdf )。出于安全原因,还要验证文件扩展名是否合适 ( .pdf )。您可以拥有一个静态哈希表,其中包含从 MIME 类型到文件扩展名的映射,并用作查找来验证扩展名。

    【讨论】:

      【解决方案2】:

      就像阿瑞说的。这都可以被欺骗。获取一个 .txt 文件,将其重命名为 pdf 文件并尝试获取内容类型。它将是“应用程序\pdf”。

      但是,我以前使用过一种解决方案。在我对 PDF 文件的简短测试中,我发现前 3 个字节总是相同的。我只尝试了前 3 个字节,因为它看起来已经足够了。前三个字节的值是:37、80、68。

      所以我读取了字节 (InputFile1.FileContent.ReadByte()),将它们与上面的 3 个字节进行比较,如果它们相同,那么我就有了一个 PDF 文件。此外,我在某处读到您应该关闭 IIS 中上传目录的脚本执行。希望对您有所帮助。

      【讨论】:

      【解决方案3】:

      FileUpload.PostedFile.ContentType 正是我想要的。

      提醒尝试做同样事情的人:PDF 文件的 MIME 类型似乎可以是“application/pdf”或“text/pdf”,因此请务必检查两者。

      【讨论】:

        【解决方案4】:

        用户可以欺骗它。在上面的解决方案中,没有验证实际字节内容。我可以向您发送可执行文件并将其伪装成 pdf,这不会捕获它。

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 2012-10-30
          • 2019-10-28
          • 1970-01-01
          • 1970-01-01
          • 2012-08-28
          • 2020-08-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多