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

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 '' не вернул контроллер для контроллера с именем «Scripts».

Что я действительно предпочел бы, так это то, чтобы запрос просто встречался с жестким сбоем еще до того, как MVC доберется до контроллера.

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

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

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

Но это не так.

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

Это было полезно?

Решение

Если ваш хостинг-провайдер поддерживает модуль перезаписи 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 (и некоторых других), включая запросы в подпапках, то я обнаружил, что приведенный ниже код работает хорошо (адаптировано из игнорировать сообщение о маршрутах от Фила Хаака)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top