Como faço para bloquear as solicitações para todos *.php, *.cgi, etc. Páginas de dentro de um aplicativo ASP.NET MVC 1.0 hospedado no iis7?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Eu gostaria de bloquear solicitações a qualquer .php ou .cgi, independentemente das informações de caminho.

Por exemplo, quando o seguinte URL é usado:

http: //meu site/Admin/scripts/setup.php

Combina uma rota existente:

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

No entanto, não há controlador para scripts, então o MVC lança o seguinte:

O icontrollerFactory '' não retornou um controlador para um controlador chamado 'scripts'.

O que eu realmente preferiria é que a solicitação é simplesmente atendida com uma falha difícil antes que o MVC chegasse ao controlador.

Sei que posso fazer isso conectando o Application_BeginRequest no global.asax e jogando uma nova httpexception (404, "não encontrada"), mas essa não é a solução elegante que estou procurando.

Eu realmente esperava que isso funcionasse:

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

Mas não.

Nota: a resposta de Sean Lynch funciona muito bem, mas eu ainda gostaria muito de um sistema.Web.Routing ou System.Web.MVC Solução. Dessa forma, posso permitir que meus usuários adicionem suas próprias exclusões em tempo de execução.

Foi útil?

Solução

Se você provedor de hospedagem suportar o módulo de reescrita do URL do IIS7, poderá conferir este link:

http://learn.iis.net/page.aspx/499/request-blocking----rule-template/

Atualização aqui é o que você colocaria em seu web.config na seção 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>

Outras dicas

Eu sei que este é um post antigo, mas se você está procurando uma rota ignorada para solicitações de PHP (e algumas outras), incluindo solicitações nas sub -pastas, descobri que o código abaixo funciona bem (adaptado do ignorar as rotas post de Phil Haack)

Eu também adicionei uma rota de ignoramento específica para a solicitação ocasional de ícone do Apple Touch (usando um curinga para as diferentes dimensões) e permiti as diferentes extensões de arquivo para o favicon (barra de ferramentas do Google e outros navegadores procuram PNG e GIF Favicons).

É claro que você pode adicionar uma rota ignorada para todas as extensões de arquivo de imagem, mas no meu caso ainda quero rotear algumas das outras solicitações.

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(/.*)?" });

Apesar de ter essas rotas ignoradas, ainda acho que o uso do bloqueio de solicitação para arquivos PHP é preferível se você tiver acesso para fazê -lo.

eu encontrei Como ignorar a rota no roteamento de URL do ASP.NET o que pode funcionar para isso, ele usa o StotRoutingHandler Classe e, desde que os pedidos para .Php percorrem o roteamento, isso provavelmente funcionará.

Se as solicitações .php não estiverem passando pelo manipulador de roteamento, isso provavelmente não funcionaria.

Você pode bloquear essas extensões antes mesmo de atingir o IIS com o filtro ISAPI URLSCAN da Microsoft.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top