ASP.NET MVC 安全和 IIS allowSubDirConfig 配置

ASP.NET MVC security and IIS allowSubDirConfig configuration

我得知 general Microsoft recommendation our web servers will be reconfigured; among other things the allowSubDirConfig setting 之后应设置为 false。因此,我们的 ASP.NET 应用程序必须在其根级别使用单个 Web.config(顺便说一句,这对我们的应用程序来说是完全可以的)。

然而,ASP.NET MVC 使用 "non root level" 配置文件(默认情况下!)用于 Views 目录,其中包含一个简单(但重要?)与 Web 服务器相关的部分:

<system.webServer>
    <handlers>
        <remove name="BlockViewHandler" />
        <add name="BlockViewHandler"
            path="*"
            verb="*"
            preCondition="integratedMode"
            type="System.Web.HttpNotFoundHandler" />
    </handlers>
</system.webServer>

关于 a post by Phil Haack 这与安全相关,因此很重要。

由于其他 .NET Framework 相关部分 still work,因为 ASP.NET 运行时不遵守 allowSubDirConfig 设置,ASP.NET MVC 应用程序仍然可以工作。所以忽略的网络服务器配置在一般使用过程中并没有真正引起注意,虽然我对此有一种不好的感觉。

这不是个糟糕的主意吗?如果 Web 服务器以这种方式配置(根据推荐),那些 ASP.NET MVC 应用程序有多脆弱?

HttpNotFoundHandler 有一个路径属性,这意味着您可以将它添加到根配置文件并指向 Views 文件夹的路径,并且您不会以任何方式改变安全级别:

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="Views/*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

这将适用于基本的 web.config 文件,但如果您是 adding/removing 处理程序作为应用程序的一部分,请注意。 BlockViewHandler 之前的处理程序仍然可以从 Views 子文件夹传送内容(但我相信 Views 目录中的标准 web.config 也是这种情况,除非您专门删除那里的处理程序)。

一般来说,IIS 不会提供 Views 文件夹中的 .cshtml 文件(除非特别允许),即使 system.webServer 部分是 Views 子目录中的 missing/ignored。

但它会提供其他文件(例如 html、css、js),这些文件会被 BlockViewHandler 处理程序阻止,这可能会降低安全性。