我从 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