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

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

Решение

Если ваш хостинг-провайдер поддерживает модуль перезаписи 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>

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

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

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

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

Другие вопросы по тегам