2009-10-08 9 views
9

Me gustaría bloquear las solicitudes a cualquier .php o .cgi independientemente de la información de la ruta.¿Cómo bloqueo las solicitudes para todas las páginas * .php, * .cgi, etc. desde dentro de una aplicación ASP.NET MVC 1.0 alojada en IIS7?

Por ejemplo, cuando la siguiente dirección se utiliza:

http: // mysite /Admin/Scripts/Setup.php

Coincide con una ruta existente:

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

Sin embargo, no hay controlador para las secuencias de comandos, por lo que MVC arroja lo siguiente:

El IControllerFactory '' no devolvió un controlador para un controlador llamado 'scripts'.

Lo que realmente prefiero es que la solicitud se resuelva simplemente con un error grave antes de que MVC llegue al controlador.

Sé que puedo hacer esto conectando Application_BeginRequest en Global.asax y lanzando una nueva HttpException (404, "No encontrado") pero esa no es exactamente la solución elegante que estoy buscando.

Me esperaba que esto funcionaría:

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

pero no es así.

NOTA: La respuesta de Sean Lynch funciona muy bien pero todavía me gustaría una solución basada en System.Web.Routing o System.Web.Mvc. De esa forma puedo permitir a mis usuarios agregar sus propias exclusiones en tiempo de ejecución.

+0

Esto no es una respuesta, pero ciertamente jugaría con el depurador de rutas de Phil Haack. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx Le permitirá saber qué ruta toma la url que está probando. También me gustaría investigar la desactivación de la asignación de archivos existente – MarkKGreenway

Respuesta

7

Si hospedaje proveedor admite el módulo de reescritura de URL IIS7 continuación se puede consultar este enlace:

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

actualización aquí es lo que cabe poner en su web.config en la sección 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> 
+1

En segundo lugar. Utilice el tipo de acción AbortRequest y la solicitud nunca más llegará. –

+0

¿Se pueden agregar las reglas del módulo Reescribir URL desde mi aplicación, o desde el directorio de la aplicación en el disco o debo usar el Administrador IIS para configurarlas? –

+0

Puede definir las reglas en el archivo web.config de su aplicación, por lo que no necesita usar el Administrador de IIS para configurarlas. Sin embargo, no estoy seguro del XML exacto que se usaría. No tengo acceso al Administrador de IIS ahora mismo para probarlo. –

0

he encontrado How to ignore route in asp.net forms url routing que podría trabajar para ello, se utiliza la clase StopRoutingHandler, y siempre y cuando las solicitudes de .php se ejecutan a través del enrutamiento esto probablemente va a trabajar.

Si las solicitudes .php no pasan por el controlador de enrutamiento, probablemente esto no funcione.

0

Puede bloquear estas extensiones incluso antes de que lleguen a IIS con el filtro ISAPI de UrlScan de Microsoft.

15

Sé que esto es una entrada antigua, pero si usted está buscando una ruta para hacer caso omiso de las peticiones de PHP (y algunos otros), incluyendo las solicitudes dentro de las subcarpetas entonces he encontrado el siguiente código funciona bien (adaptado del ignore routes post from Phil Haack)

También agregué una ruta de ignorar específica para la solicitud de icono de toque de manzana ocasional (usando un comodín para las diferentes dimensiones) y permití las diferentes extensiones de archivo para el favicon (la barra de herramientas de Google y otros buscadores buscaron png and gif favicons).

Por supuesto, podría agregar una ruta de ignorar para todas las extensiones de archivos de imagen, pero en mi caso, todavía quiero enrutar algunas de las otras solicitudes.

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

A pesar de tener éstos ignoran rutas, sigo pensando que el uso de solicitud de bloqueo de archivos PHP es preferible si tiene acceso a hacerlo.

+4

Solo una pequeña nota sobre el icono de toque de manzana, el RegEx a usar debe ser 'routes.IgnoreRoute (" {* allappleicon} ", nuevo {allappleicon = @" apple-touch-icon -?. * \. Png (/.*)? "});' porque su versión no excluía el Apple-touch-icon.png –

Cuestiones relacionadas