Как заблокировать запросы для всех страниц * .php, * .cgi и т. Д. Из приложения ASP.NET MVC 1.0, размещенного в IIS7? - PullRequest
11 голосов
/ 08 октября 2009

Я бы хотел заблокировать запросы к любому .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 когда-либо попадал в контроллер.

Я знаю, что могу сделать это, подключив Application_BeginRequest в Global.asax и выбрасывая новое исключение HttpException (404, «Not Found»), но это не совсем элегантное решение, которое я ищу.

Я действительно надеялся, что это сработает:

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

Но это не так.

ПРИМЕЧАНИЕ. Ответ Шона Линча прекрасно работает, но мне все равно очень хотелось бы решение на основе System.Web.Routing или System.Web.Mvc. Таким образом, я могу позволить своим пользователям добавлять свои собственные исключения во время выполнения.

Ответы [ 4 ]

15 голосов
/ 09 ноября 2011

Я знаю, что это старый пост, но если вы ищете маршрут игнорирования запросов php (и некоторых других), включая запросы в подпапках, то я обнаружил, что приведенный ниже код работает хорошо (адаптировано из игнорирования маршруты из Фила Хаака )

Я также добавил специальный маршрут игнорирования для случайного запроса значка касания яблока (с использованием подстановочного знака для разных измерений) и разрешил использовать различные расширения файлов для значка (панель инструментов 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 предпочтительнее, если у вас есть доступ для этого.

9 голосов
/ 08 октября 2009

Если ваш хостинг-провайдер поддерживает модуль перезаписи URL IIS7, вы можете воспользоваться этой ссылкой:

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>
0 голосов
/ 09 октября 2009

Вы можете заблокировать эти расширения еще до того, как они попадут в IIS с помощью Microsoft UrlScan ISAPI Filter.

0 голосов
/ 09 октября 2009

Я нашел Как игнорировать маршрут в формах asp.net, URL-маршрутизация , который может работать для этого, он использует класс StopRoutingHandler и до тех пор, пока выполняются запросы к .php запустить через маршрутизацию, это, вероятно, будет работать.

Если запросы .php не проходят через обработчик маршрутизации, это, вероятно, не сработает.

...