如何在操作系统中接受具有指定内容类型的文件

时间:2012-03-21 05:41:06

标签: c# asp.net file-upload content-type

因为我正在尝试上传文件,我正在尝试检查他们的扩展名,因为我知道这不是一个好习惯,所以这是我正在做的代码。它工作正常,但由于我在Apple Mac用户中遇到问题,他们无法上传pdf文件。

   if (upload1.HasFile)
      {
       Finfo = new FileInfo(upload1.PostedFile.FileName);
       if (Finfo.Extension.ToLower() == ".docx" || Finfo.Extension.ToLower() == ".doc" || Finfo.Extension.ToLower() == ".xls" ||
                            Finfo.Extension.ToLower() == ".xlsx" || Finfo.Extension.ToLower() == ".pdf" || Finfo.Extension.ToLower() == ".jpg" ||
                            Finfo.Extension.ToLower() == ".png" || Finfo.Extension.ToLower() == ".gif" || Finfo.Extension.ToLower() == ".txt" ||
                            Finfo.Extension.ToLower() == ".mp4" || Finfo.Extension.ToLower() == "ppt" || Finfo.Extension.ToLower() == ".bmp" ||
                            Finfo.Extension.ToLower() == ".swf" || Finfo.Extension.ToLower() == ".rm" || Finfo.Extension.ToLower() == ".pptx")
        {
           // Accept File 
        }
}

现在我认为我将使用此代码,以便它将解决问题

if (
        upload1.PostedFile.ContentType == "text/rtf" ||
        upload1.PostedFile.ContentType == "application/doc" ||
        upload1.PostedFile.ContentType == "appl/text" ||
        upload1.PostedFile.ContentType == "application/vnd.msword" ||
        upload1.PostedFile.ContentType == "application/vnd.ms-word" ||
        upload1.PostedFile.ContentType == "application/winword" ||
        upload1.PostedFile.ContentType == "application/word" ||
        upload1.PostedFile.ContentType == "application/msword" ||       
        upload1.PostedFile.ContentType == "application/x-msw6" ||
        upload1.PostedFile.ContentType == "application/x-msword" ||
        upload1.PostedFile.ContentType == "application/pdf" ||
                        FileUpload1.PostedFile.ContentType == "application/x-pdf" ||
        upload1.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
        upload1.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.wordprocessingml.template"
        )

是从用户接受文件的好方法。我需要允许所有文件除EXE,DMG,DLL,CS,SQL,BAT ,.我如何确保它适用于所有操作系统。

  • Apple用户可以使用OpenOffice或其他一些软件进行上传。所以我们也需要允许这种类型的文件

任何人都可以告诉我如何处理这种情况

8 个答案:

答案 0 :(得分:2)

内容类型基本上由客户端决定,但大多数客户端可能不会发送内容类型,在这种情况下,检查扩展名只是验证文件类型的最佳方式。或者你应该检查两者。我们确实遇到了一些没有发送内容类型的mac客户端的问题。

如果两者都不存在,则必须检查文件的几个初始字节以检查其类型。

内容类型不好主意,因为如果用户没有安装相应的软件,操作系统将发送错误的内容类型。

答案 1 :(得分:1)

当他们上传文件时,他们需要立即可用吗? 我过去所做的是将它们放在服务器上的挂起文件夹中,然后以给定的间隔(虽然它可能是上传后的被调用函数)我运行一个小进程来读取数据的前几个字节。这些文件类型中的大多数具有标题记录,通常以纯文本形式显示,例如PDF具有“%PDF”作为前4个字符。可执行文件通常以charcaters“MZ”开头。看看十六进制编辑器(例如TextPad将起作用)。这当然是您的最终停靠点,您的安全网,第一步是按照您的方式限制后缀(虽然这不是文件内容的真正保证)。您还可以使用MIME类型来阻止某些类型Mime Type List,这也会有所帮助。请参阅此处:http://forums.asp.net/p/1554764/3829242.aspx

编辑:请注意,您希望省略的某些文件只是文本文件:.bat和.cs。因此,MIME类型或读取数据的开头将无济于事 - 所以最好的方法是在保存在服务器上时完全禁止这些扩展或将扩展名重命名为.txt。它们不会像带有.txt扩展名的文本文件那样受到伤害;不可执行 - 你也需要考虑.reg也是猜测。

答案 2 :(得分:0)

最好的方法是使用FileOpenDialog组件让用户整齐地选择文件,同时向组件添加过滤器(例如“* .swf | swf files”)。

答案 3 :(得分:0)

您需要维护一个黑名单的内容类型,因为您知道哪些类型需要被阻止,而不是需要被允许的类型,即使以后这是一种非常安全的做法。

我会建议您在调用类似http://www.opswat.com/products/metascan

之类的文件之前运行一些防病毒Web服务或扫描

答案 4 :(得分:0)

我使用了文件扩展名甚至是COntent类型验证。随着我们限制用户不上传办公文件以外,甚至我们都尝试使用Telerik上传控件来实现功能。再次感谢所有给出答案的人。

答案 5 :(得分:0)

您是否已查看此回答Using .NET, how can you find the mime type of a file based on the file signature not the extension

服务器端可以从文件中获取mime类型,黑名单可以是您不想要的。

同样使用reg表达式来过滤打开文件对话框中的文件类型有点不可靠,因为任何用户都可以在文件名字段中键入例如并上传任何文件类型。

答案 6 :(得分:0)

“我需要允许除EXE,DMG,DLL,CS,SQL,BAT之外的所有文件,。我如何确保它可以在所有操作系统上运行。”

我会使用文件扩展名作为第一道防线,然后是内容类型,然后是文件签名。尝试使用三层深度的嵌套if语句来确保文件一直通过。

对于此代码:

if (Finfo.Extension.ToLower() == ".docx" || Finfo.Extension.ToLower() == ".doc" || Finfo.Extension.ToLower() == ".xls" ||.....

为什么不对被禁止的文件扩展名执行反向逻辑?

if (Finfo.Extension.ToLower() != ".exe" && !Finfo.Extension.ToLower() != ".dmg" && !Finfo.Extension.ToLower() != ".dll" &&.......etc

这将为您节省一些代码,特别是如果接受列表不是有限的或小的。想想以后可能需要更改代码的人....也许你:*)

答案 7 :(得分:-4)

你绝对不应该接受所有文件类型 - 这是一个巨大的安全漏洞。

我怀疑您的问题可能是用户错误。你可以验证'mac'用户在尝试上传时没有打开文件吗?没有理由从mac上传应该与pc的行为不同。

我们有类似的要求,并使用数据类型和文件扩展名来确定上传的内容。我们没有mac,pc,linux或其他方面的问题。