如何阻止所有 *.php、*.cgi 等的请求来自 IIS7 中托管的 ASP.NET MVC 1.0 应用程序内部的页面?

StackOverflow https://stackoverflow.com/questions/1539415

  •  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筛选器前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top