如何在IIS上限制/验证文件上载文件类型服务器端

时间:2012-08-10 16:17:34

标签: asp.net asp.net-mvc asp.net-mvc-3 iis file-upload

我希望有一个文件类型的白名单,用户有权上传到我的IIS服务器(我使用IIS v7.5)。

我有哪些选择?例如,要将控制器中的特定操作的文件大小限制为5MB,我将此部分添加到我的webconfig:

<location path="home/fileupload">
  <system.web>
    <!-- maxRequestLength is in kilobytes (KB) -->
    <httpRuntime maxRequestLength="5120" /> <!-- 5MB -->
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- maxAllowedContentLength is in bytes -->
        <requestLimits maxAllowedContentLength="5242880"/> <!-- 5MB -->
      </requestFiltering>
    </security>
  </system.webServer>
</location>

webconfig中是否有选项设置允许的文件类型的白名单?或者唯一的选择是在文件完全上传时验证代码中的文件类型?什么是推荐的技术?我怎么能确定.docx,.pdf,.jpg等真的是它们呢?

3 个答案:

答案 0 :(得分:3)

由于您需要服务器端,因此可以使用文件mime类型。

THIS帖子显示了如何根据文件内容(而不是扩展名)确定MIME类型。

如果您确实要将输入限制为SPECIFIC文件扩展名,则只需根据您要接受的内容检查输入名称即可。如果这个通过,你可以在我链接的帖子中对库进行外部参照,以确保用户不只是更改你的文件扩展名。

这样做可以很好地确定文件是您想要接受的文件!

编辑:基于迄今为止的评论.... 基于你所说的你正在寻找这种方法应该对你很好。我的建议是你只想将它限制在你的一个评论中列出的文件类型...对文件扩展名进行简单检查。如果有效,则将文件传递给链接中列出的urlmon.dll。确保它不会作为无效类型返回.... aka Executable / java / zip / etc.如果它不是无效类型,那么您将非常确定它是一个安全的文件!

最后,通过阅读该帖子上的评论,看起来urlmon.dll可能会支持您想要隐藏的所有文件类型,这样就无需检查它是不是可执行文件还是那种性质的文件,但您需要确认doc / docx / xsl / xslx确实返回有效的mime类型。

答案 1 :(得分:1)

不,没有web.config设置来限制上传的内容。 验证上传数据的唯一可能方法是在代码中实际验证该数据。

即使有设置,但无论如何它都是无用的,因为它将基于从客户端收到的Content-Type标头,这可能是非常错误的。

在代码中,您当然可以查看Content-Type标头,但如果您尝试验证上传的数据是否属于特定类型,则必须根据具体类型手动执行此操作你期待的数据。对于图像,这很容易。对于其他文件类型,可能会困难得多。

答案 2 :(得分:0)

Data Anotations正是您所寻找的,这是一个可以帮助您的搜索,google data anotaions

<强>更新

我认为它可以验证文件扩展名。如果您不依赖file extensions,我认为您最好的办法是验证MIME types。这种情况比较复杂,因浏览器而异,可能会伪造(虽然这比伪造扩展程序更复杂。)

一个简单但不自由的选择是使用Telerik RadAsyncUpload

你可以自己编写这段代码(虽然我从未搞砸过它)this可能会让你开始。 (这篇文章讲述了这样一个事实,即你不能在没有IIS的情况下可靠地检测mime类型,但它应该让你顺利进行。)

希望这会让你前进。如您所知,您可以按文件大小限制文件,按其扩展名进行验证,如果您按MIME类型添加验证,我认为您已尽力而为。我认为这是为了安全而不排除有效文件所能做的一切;虽然我听说过散列文件和其他一些选项;但这些最挑衅地排除合法档案。

另外,正如我所提到的,MIME类型可以是假货并发送到您的服务器,以便在客户端和服务器端验证时更加安全。