2009-07-23 7 views
8

¿Es posible prohibir ciertos agentes de usuario directamente desde web.config? Ciertos robots parecen no seguir el archivo robots.txt, y para evitar la carga inútil del servidor (y el correo no deseado), me gustaría evitar que ciertas clases de solicitudes (en particular basadas en el agente de usuario o muy posiblemente en la dirección IP) procedan. .Uso de web.config para prohibir agentes de usuario

Puntos de bonificación si sabe si es igualmente posible evitar que tales solicitudes se registren por completo en el archivo de registro de IIS. (es decir, if-request-match, reenvía a/dev/null, si entiende mi significado).

Sería preferible una solución para win2003, pero este es un problema recurrente: si hay una solución limpia para IIS7 pero no para IIS6, me gustaría saberlo.

Edit: Lo siento por la pregunta incompleta anterior, tuve la pestaña + ingresó accidentalmente.

Respuesta

11

Esto se puede hacer bastante fácilmente utilizando el módulo URLRewrite en IIS7. Pero realmente no sé si esto evitará que esas solicitudes se registren.

<rewrite> 
    <rules> 
    <rule name="Ban user-agent RogueBot" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions> 
     <add input="{HTTP_USER_AGENT}" pattern="RogueBotName" /> 
     <add input="{MyPrivatePages:{REQUEST_URI}}" pattern="(.+)" /> 
     </conditions> 
     <action type="AbortRequest" /> 
    </rule> 
    </rules> 
    <rewriteMaps> 
    <rewriteMap name="MyPrivatePages"> 
     <add key="/PrivatePage1.aspx" value="block" /> 
     <add key="/PrivatePage2.aspx" value="block" /> 
     <add key="/PrivatePage3.aspx" value="block" /> 
    </rewriteMap> 
    </rewriteMaps> 
</rewrite> 
+0

Bueno, el sitio es lo suficientemente pequeño como para que el registro de IIS no sea un perf. problema; en su mayor parte es solo ruido, no me importaría evitarlo, pero esta solución es exactamente lo que esperaba: un módulo configurable que puede abortar ciertas solicitudes. Lo investigaré, gracias! –

+0

¿Sabes si es posible crear una regla para múltiples bots? – UpTheCreek

+0

@UpTheCreek Es un patrón, por lo que siempre que tenga una expresión regular que identifique todos los bots en cuestión que desea buscar, puede conectarlo allí. Tendría cuidado con eso, aunque parezca un poco peligroso matar el tráfico normal si no tienes cuidado. –

0

No crea que puede hacer esto desde web.config (la autorización en web.config es para usuarios, no para bots). Su mejor opción sería algún tipo de filtro ISAPI personalizado para IIS. Hay un blog about this here. ¡Buena suerte!

3

Puede escribir un ASP.Net HttpModule personalizado como lo hice para mi sitio para prohibir algunos bots deshonestos. Aquí está el código:

public class UserAgentBasedRedirecter : IHttpModule 
{ 
    private static readonly Regex _bannedUserAgentsRegex = null; 
    private static readonly string _bannedAgentsRedirectUrl = null; 

    static UserAgentBasedRedirecter() 
    { 
      _bannedAgentsRedirectUrl = ConfigurationManager.AppSettings["UserAgentBasedRedirecter.RedirectUrl"]; 
      if (String.IsNullOrEmpty(_bannedAgentsRedirectUrl)) 
       _bannedAgentsRedirectUrl = "~/Does/Not/Exist.html"; 

      string regex = ConfigurationManager.AppSettings["UserAgentBasedRedirecter.UserAgentsRegex"]; 
      if (!String.IsNullOrEmpty(regex)) 
       _bannedUserAgentsRegex = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
    } 

    #region Implementation of IHttpModule 

    public void Init(HttpApplication context) 
    { 
      context.PreRequestHandlerExecute += RedirectMatchedUserAgents; 
    } 

    private static void RedirectMatchedUserAgents(object sender, System.EventArgs e) 
    { 
      HttpApplication app = sender as HttpApplication; 

      if (_bannedUserAgentsRegex != null && 
       app != null && app.Request != null && !String.IsNullOrEmpty(app.Request.UserAgent)) 
      { 
       if (_bannedUserAgentsRegex.Match(app.Request.UserAgent).Success) 
       { 
        app.Response.Redirect(_bannedAgentsRedirectUrl); 
       } 
      } 
    } 

    public void Dispose() 
    { } 

    #endregion 
} 

Tendrá que registrarla en web.config y especifique la expresión regular a utilizar para que coincida con las cadenas de agente de usuario. Aquí hay uno que usé para prohibir el tráfico de msnbot/1.1:

<configuration> 
    <appSettings> 
     <add key="UserAgentBasedRedirecter.UserAgentsRegex" value="^msnbot/1.1" /> 
    </appSettings> 
... 
    <system.web> 
     <httpModules> 
      <add name="UserAgentBasedRedirecter" type="Andies.Web.Traffic.UserAgentBasedRedirecter, Andies.Web" /> 
     </httpModules> 
    </system.web> 
</configuration> 
+0

Esto se ve aún más como lo que estaba buscando :-) ¡gracias! ¿Sabes por casualidad si esto impide que se registren las solicitudes? Probablemente no, ¿verdad? –

+1

No lo he comprobado, pero me imagino que viendo que esto ya pasó por la tubería ASP.Net, ya está en los registros – emertechie

Cuestiones relacionadas