2009-07-23 5 views
8

Est-il possible d'interdire certains agents utilisateurs directement depuis web.config? Certains robots semblent ne pas suivre robots.txt, et pour éviter une charge de serveur inutile (et le spaming de fichier journal), je voudrais éviter que certaines classes de requêtes (en particulier basées sur l'user-agent ou très probablement l'adresse IP) .Utilisation de web.config pour interdire les agents d'utilisateur

Points bonus si vous savez qu'il est également possible d'éviter que ces demandes soient entièrement consignées dans le fichier journal d'IIS. (c'est-à-dire if-request-match, transmettre à/dev/null, si vous obtenez ma signification).

Une solution pour win2003 serait préférable, mais c'est un problème récurrent - s'il y a une solution propre pour IIS7 mais pas IIS6, je serais heureux de le savoir. Désolé pour la question incomplète plus tôt, j'avais tab + entré accidentellement.

Répondre

11

Cela peut être fait assez facilement en utilisant le module URLRewrite dans IIS7. Mais je ne sais vraiment pas si cela empêchera ces demandes d'être enregistrées.

<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

Eh bien, le site est suffisamment petit pour que le journal IIS ne soit pas un perf. problème; c'est surtout du bruit que cela ne me dérangerait pas d'éviter - mais cette solution est exactement ce que j'espérais - un module configurable qui peut interrompre certaines requêtes. Je vais regarder dedans, merci! –

+0

Savez-vous s'il est possible de créer une règle pour plusieurs robots? – UpTheCreek

+0

@UpTheCreek C'est un pattern, aussi longtemps que vous avez une expression régulière qui identifie tous les bots en question, vous pouvez le brancher ici. Je ferais attention à ce sujet cependant, il semble légèrement dangereux de tuer la circulation normale si vous ne faites pas attention. –

0

Ne pensez pas que vous pouvez le faire depuis web.config (l'autorisation dans web.config est pour les utilisateurs, pas pour les robots). Votre meilleur pari serait une sorte de filtre ISAPI personnalisé pour IIS lui-même. Il y a un blog about this here. Bonne chance!

3

Vous pouvez écrire un HttpModule ASP.Net personnalisé comme je l'ai fait pour mon site pour interdire certains bots voyous. Voici le code:

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 
} 

Vous devez vous inscrire dans web.config et préciser l'expression régulière à utiliser pour correspondre à des chaînes de l'agent utilisateur. En voici un que j'ai utilisé pour interdire le trafic 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

Cela ressemble encore plus à ce que je cherchais :-) merci! Savez-vous si cela empêche les demandes d'être enregistrées? Probablement pas, non? –

+1

N'a pas vérifié, mais j'imagine que vu que cela a déjà traversé le pipeline ASP.Net, il est déjà dans les journaux – emertechie

Questions connexes