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

Asp.net 如何在IIS服务器端限制/验证文件上载文件类型,asp.net,asp.net-mvc,asp.net-mvc-3,iis,file-upload,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Iis,File Upload,我想有一个文件类型的白名单,用户有权上传到我的IIS服务器(im使用IIS v7.5) 我有什么选择?例如,为了将控制器中特定操作的文件大小限制为5MB,我将此部分添加到我的网络配置中: <location path="home/fileupload"> <system.web> <!-- maxRequestLength is in kilobytes (KB) --> <httpRuntime maxRequestLength="

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

我有什么选择?例如,为了将控制器中特定操作的文件大小限制为5MB,我将此部分添加到我的网络配置中:

<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等文件是真实的呢?

您正在寻找的是数据统计,这里有一个搜索可能对您有所帮助

更新

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

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

你可以自己写这段代码(尽管我从来没有把它弄糟过),这样你就可以开始了。(这篇文章讨论了一个事实,即没有IIS,您无法可靠地检测mime类型,但它应该会让您走上正轨。)

希望这能让你走。正如您所知,您可以通过文件大小限制文件,通过扩展名验证文件,如果您添加了MIME类型验证,我认为您已经做了所有可以做的事情。我认为这是所有你能做的是安全的,不排除有效的文件;虽然我听说过散列文件和其他一些选项;但这些文件最有挑战性地排除了合法文件


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

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

即使有设置,它也毫无用处,因为它将基于从客户端接收的内容类型头,这可能是非常错误的


在代码中,您当然可以查看内容类型标题,但如果您试图验证上传的数据是否属于特定类型,则必须根据您期望的数据类型手动进行验证。对于图像来说,这很简单。对于其他文件类型,这可能要困难得多。

因为您需要服务器端,所以可以使用文件mime类型

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

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

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

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


最后,通读那篇帖子上的评论,看起来
urlmon.dll
可能会隐式支持您想要的所有文件类型,这样就不需要检查它是否是可执行文件或类似的文件,但是您需要确认doc/docx/xsl/xslx确实返回了有效的mime类型。

是否有理由不在客户端验证它?因为不是所有浏览器都支持此功能,而且所有内容都应该在服务器端验证@AlexandreJobin您希望如何确定该文件是否与用户所说的相同?@Jared,因为用户上传的文件将被其他人使用。为了满足我的需要,我的要求肯定有点过分了。但是,由于我必须制作一个模块来管理上传,我对自己说,我会花时间在第一时间把它做好,这个模块对我们所有的项目都有好处。如果一个.exe文件被重命名为.docx或.zip文件,并且有人试图打开它,会发生什么情况?这会很危险吗?我不知道,我试图将所有内容都安全化:)那么,验证文件的技术是什么呢?你知道一个好的库可以验证文件的真实类型吗?这取决于文件。没有神奇的解决方案可以验证所有类型的文件。你想用什么样的文件?对于我的实际项目,我需要验证pdf、doc、docx、xls、xlsx和图像。我不会有任何视频或音频。只有可打印的文档。任何文件类型都可以通过尝试将其解析为给定的文件类型,然后处理异常来验证。图像可以通过前几个字节进行验证,这里已经有了答案。这里有一些例子:这不是唯一的方法。。。但有一种方式是超级参与的,我刚刚写了一个,我计划很快写博客。。。但基本上,您必须在C++中编写本地模块,并订阅OnCuiReReReStestStand(Nut.Net)。然后检查HttpMethod是否为post。然后使用HttpRequest::ReadEntityBody将post数据逐块加载到一个完整的块缓冲区中。区块计数在HttpRawRequest中。。。然后使用Mime类型解析器解析文件名的post数据。如果其中有坏文件,请返回Reques