如何从IIS7中托管的ASP.NET MVC 1.0应用程序中阻止对所有*.php,*.cgi等页面的请求?

Dou*_*son 12 asp.net-mvc ignoreroute

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

例如,使用以下URL时:

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

它匹配现有路线:

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

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

IControllerFactory''没有返回名为'scripts'的控制器的控制器.

我真正喜欢的是,在MVC进入控制器之前,请求只是遇到了一次硬故障.

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

我真的希望这会奏效:

routeCollection.IgnoreRoute("{resource}.php/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

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

rob*_*mzd 15

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

我还为偶尔的Apple触摸图标请求添加了一个特定的忽略路由(使用不同维度的通配符),并允许使用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(/.*)?" });
Run Code Online (Sandbox Code Playgroud)

尽管有这些忽略路由,我仍然认为如果你有权访问php文件请使用请求阻止.

  • 关于apple-touch-icon的一点说明,要使用的RegEx应该是`routes.IgnoreRoute("{*allappleicon}",new {allappleicon = @"apple-touch-icon - ?.*\.png(/ .*)?"});`因为你的版本不排除apple-touch-icon.png (4认同)

Sea*_*nch 9

如果您的托管服务提供商支持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>
Run Code Online (Sandbox Code Playgroud)