如何阻止所有 *.php、*.cgi 等的请求来自 IIS7 中托管的 ASP.NET MVC 1.0 应用程序内部的页面?
-
20-09-2019 - |
题
我想阻止对任何 .php 或 .cgi 的请求,无论路径信息如何。
例如,当使用以下 url 时:
http://我的网站/管理/脚本/Setup.php
它与现有路线匹配:
routeCollection.MapRoute("Admin", "admin/{controller}/{action}/{uid}/{*pathInfo}", new { controller = "Admin", action = "Index", uid = "" });
然而,脚本没有控制器,因此 MVC 会抛出以下错误:
IconTrollerFactory''没有返回名为“脚本”的控制器的控制器。
我真正喜欢的是,在 MVC 到达控制器之前,该请求就简单地遇到了硬故障。
我知道我可以通过在 Global.asax 中挂钩 Application_BeginRequest 并抛出一个新的 HttpException(404, "Not Found") 来做到这一点,但这并不是我正在寻找的优雅解决方案。
我真的希望这会起作用:
routeCollection.IgnoreRoute("{resource}.php/{*pathInfo}");
但事实并非如此。
笔记:Sean Lynch 的答案效果很好,但我仍然非常喜欢基于 System.Web.Routing 或 System.Web.Mvc 的解决方案。这样我就可以允许我的用户在运行时添加他们自己的排除项。
解决方案
如果您的托管服务提供商支持IIS7 URL重写模块,那么你可以看看这个链接:
http://learn.iis.net /page.aspx/499/request-blocking---rule-template/
在这里更新是什么,你会投入你的web.config中system.webserver部分:
<system.webServer>
<rewrite>
<rules>
<rule name="RequestBlockingRule1" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{URL}" pattern="*.php*" />
</conditions>
<action type="CustomResponse" statusCode="403" />
</rule>
</rules>
</rewrite>
</system.webServer>
其他提示
我知道这是一篇旧文章,但如果您正在寻找 php 请求(以及其他一些请求)的忽略路由,包括子文件夹中的请求,那么我发现下面的代码效果很好(改编自 忽略 Phil Haack 发布的路线)
我还为偶尔的苹果触摸图标请求添加了一个特定的忽略路由(对不同尺寸使用通配符),并允许 favicon 使用不同的文件扩展名(Google 工具栏和其他一些浏览器会查找 png 和 gif 图标).
当然,您可以为所有图像文件扩展名添加忽略路由,但就我而言,我仍然想路由一些其他请求。
routes.IgnoreRoute("{*allphp}", new { allphp = @".*\.php(/.*)?" });
routes.IgnoreRoute("{*allcgi}", new { allcgi = @".*\.cgi(/.*)?" });
routes.IgnoreRoute("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" });
routes.IgnoreRoute("{*favicons}", new { favicons = @".*favicon\.(ico|gif|png)(/.*)?" });
routes.IgnoreRoute("{*allappleicon}", new { allappleicon = @"apple-touch-icon-.*\.png(/.*)?" });
尽管有这些忽略路由,但我仍然认为,如果您有权执行此操作,则最好对 php 文件使用请求阻止。
我发现如何忽略ASP路线。净形式的URL路由这可能会为这项工作,它使用的 StopRoutingHandler 类,并且只要请求.PHP不通过运行路由这可能会工作。
如果.php为请求无法通过路由处理器会那么这可能是行不通的。
您可以阻止这些扩展它甚至击中IIS与微软的URLScan ISAPI筛选器前。