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



我希望有一个文件类型的白名单,用户有权上传到我的IIS服务器(im使用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等是否真的是它们?

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

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

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

这样做将提供相当好的确定性,即该文件是您要接受的文件!

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

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

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

即使有一个设置,它无论如何都是无用的,因为它将基于从客户端接收的内容类型标头,这可能是非常错误的。

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

数据注释是你正在寻找的,这里有一个搜索可能会帮助你,谷歌数据匿名

更新

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

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

你可以自己编写这段代码(虽然我从来没有搞砸过它),这可能会让你开始。(这篇文章涉及这样一个事实,即如果没有 IIS,您无法可靠地检测 MIME 类型,但它应该会让您继续前进。

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

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

最新更新