如何让 IIS8/Server2012/Azure 删除诸如 *.php 之类的 URL 而不生成 404?

如何让 IIS8/Server2012/Azure 删除诸如 *.php 之类的 URL 而不生成 404?

我从 IIS7 开始就一直在使用 URL 重写脚本。这段代码来自我的工作代码,在 IIS7.5 上工作正常;

<rewrite>
  <rules>
    <!-- Bad Unused Nuisance URLs -->
    <rule name="Reject Bad Unused Nuisance URLs" stopProcessing="true" patternSyntax="ECMAScript" enabled="true">
      <match url="(.*\.php$)|(.*\.cgi$)" ignoreCase="true" />
      <action type="AbortRequest" />
    </rule>
  </rules>
</rewrite>

然而,在 IIS8(Azure 上的 Windows Server 2012)上,它不再起作用。我没有默默地放弃请求,而是得到了 404。我不希望请求走那么远。

我认为它可能在管道早期被其他东西处理了,因此我尝试了 IIS 请求过滤;

        <requestFiltering allowDoubleEscaping="false" allowHighBitCharacters="false">
        ...
            <fileExtensions allowUnlisted="false" applyToWebDAV="true">
                <add fileExtension="." allowed="true" />
        ...
                <add fileExtension=".php" allowed="false" />
                <add fileExtension=".cgi" allowed="false" />
            </fileExtensions>
                    ...
       </requestFiltering>

但这并没有什么区别,这并不出乎意料,因为我allowUnlisted=false无论如何都有。

这些 URL 仍以自定义 404 页面的形式进入我的应用程序。我该如何尽快终止它们?

答案1

只要我执行以下操作,我就可以将其传递给 URL 重写处理程序(然后它会静默地将其丢弃);

            <add fileExtension=".php" allowed="true" />
            <add fileExtension=".cgi" allowed="true" />

然后允许它尝试通过我的静态文件处理程序运行;

<staticContent lockAttributes="isDocFooterFileName">
   ....  
    <mimeMap fileExtension=".php" mimeType="text/html" />
    <mimeMap fileExtension=".cgi" mimeType="text/html" />

但这确实让人感觉非常不对。

实际上,我也将其添加到我的<handlers/>部分中,而不是通过静态文件处理器,这在配置错误的情况下会更安全一些,但这仍然不是一个非常漂亮的场景;

            <add name="No-PHP" path="*.php" verb="*" type="System.Web.HttpForbiddenHandler" />
            <add name="No-CGI" path="*.cgi" verb="*" type="System.Web.HttpForbiddenHandler" />

这仅仅是 IIS 请求过滤的限制吗?

答案2

我认为你可能把事情弄得太复杂了。你可以使用 Microsoft 的 URLScan 扩展来轻松完成此操作,以加强 IIS 的安全性,然后使用其规则阻止此操作和其他你想要阻止的操作。

http://www.iis.net/downloads/microsoft/urlscan

在配置中,您可以全局执行此操作,也可以通过站点执行类似下面的操作。(这是一个粗略的例子)

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <fileExtensions allowUnlisted="true" >
     <add fileExtension=".php" allowed="false"/>
    </fileExtensions>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

参考:http://www.iis.net/learn/manage/configuring-security/use-request-filtering

相关内容