14

无论路径信息如何,我都想阻止对任何 .php 或 .cgi 的请求。

例如,当使用以下 url 时:

http:// mysite /Admin/Scripts/Setup.php

它匹配现有路线:

routeCollection.MapRoute("Admin", "admin/{controller}/{action}/{uid}/{*pathInfo}", new { controller = "Admin", action = "Index", uid = "" });

但是没有脚本控制器,因此 MVC 抛出以下内容:

IControllerFactory '' 没有为名为 'scripts' 的控制器返回一个控制器。

我真正喜欢的是,在 MVC 到达控制器之前,该请求只是遇到了硬失败。

我知道我可以通过在 Global.asax 中挂钩 Application_BeginRequest 并抛出一个新的 HttpException(404, "Not Found") 来做到这一点,但这并不是我正在寻找的优雅解决方案。

我真的希望这会奏效:

routeCollection.IgnoreRoute("{resource}.php/{*pathInfo}");

但事实并非如此。

注意:Sean Lynch 的回答效果很好,但我仍然非常想要基于 System.Web.Routing 或 System.Web.Mvc 的解决方案。这样我就可以允许我的用户在运行时添加他们自己的排除项。

4

4 回答 4

15

我知道这是一篇旧帖子,但如果您正在寻找 php 请求(和其他一些请求)的忽略路由,包括子文件夹中的请求,那么我发现下面的代码运行良好(改编自 Phil Haack 的忽略路由帖子

我还为偶尔的苹果触摸图标请求添加了一个特定的忽略路由(对不同的尺寸使用通配符),并允许 favicon 的不同文件扩展名(Google 工具栏和其他一些浏览器查找png 和 gif favicons)。

当然,您可以为所有图像文件扩展名添加忽略路由,但在我的情况下,我仍然想路由其他一些请求。

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 文件的请求阻止,则更可取。

于 2011-11-09T18:50:31.840 回答
10

如果您的托管服务提供商支持 IIS7 URL 重写模块,那么您可以查看此链接:

http://learn.iis.net/page.aspx/499/request-blocking---rule-template/

这里的更新是您将在 system.webserver 部分中放入 web.config 的内容:

<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>
于 2009-10-08T17:51:34.117 回答
0

我发现How to ignore route in asp.net forms url routing可能适用于此,它使用StopRoutingHandler类,并且只要对 .php 的请求确实通过路由运行,这可能会起作用。

如果 .php 请求没有通过路由处理程序,那么这可能不起作用。

于 2009-10-08T20:04:27.000 回答
0

您甚至可以在使用 Microsoft 的 UrlScan ISAPI 过滤器访问 IIS 之前阻止这些扩展。

于 2009-10-09T02:36:22.547 回答