6

我想要一个用户有权上传到我的 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 等文件确实是它们的样子?

4

3 回答 3

3

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

这篇文章展示了如何根据文件内容(而不是扩展名)确定 MIME 类型。

如果您确实想将输入限制为特定文件扩展名,您可以简单地检查输入名称与您想要接受的名称。如果通过了,您可以在我链接的帖子中对库进行外部参照,以确保用户不只是更改您的文件扩展名。

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

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

最后,通读那篇文章的评论,它看起来urlmon.dll可能支持你想要的所有文件类型,这将消除检查它是否不是可执行文件或类似性质的东西的需要,但你需要确认doc/docx/xsl/xslx 确实返回一个有效的 mime 类型。

于 2012-08-18T05:55:50.853 回答
1

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

即使有一个设置,它也是无用的,因为它将基于从客户端接收到的 Content-Type 标头,这可能是非常错误的。

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

于 2012-08-18T02:15:15.587 回答
0

Data Annotations 是您正在寻找的东西,这里有一个可能对您有帮助的搜索,google data anotaions

更新

我认为它验证了文件扩展名。如果您不想依赖file extensions,我认为您最好的选择是验证MIME 类型。这更复杂,并且因浏览器而异,并且可以伪造(尽管这比伪造扩展更复杂。)

一个简单但不是免费的选项是使用Telerik RadAsyncUpload

你可以自己编写这段代码(虽然我从来没有搞砸过),可能会让你开始。(这篇文章讨论了没有 IIS 就无法可靠地检测 mime 类型的事实,但它应该能让您顺利上路。)

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

此外,正如我所提到的,MIME 类型可以是伪造的并发送到您的服务器,为了更加安全,您应该在客户端和服务器端都进行验证。

于 2012-08-10T18:16:29.410 回答