2009-07-23 7 views
8

Czy można zabronić niektórych programów klienckich bezpośrednio z pliku web.config? Niektóre roboty wydają się nie podążać za plikiem robots.txt i aby uniknąć bezsensownego ładowania serwera (i spamowania plików dziennika), chciałbym, aby pewne klasy żądań (w szczególności na podstawie klienta użytkownika lub bardzo prawdopodobnie adresu IP) nie działały .Używanie web.config do blokowania programów typu user-agent

Punkty premiowe, jeśli wiesz, że można w podobny sposób całkowicie uniemożliwić rejestrowanie takich żądań w pliku logicznym IIS. (np. jeśli-request-match, prześlij do/dev/null, jeśli rozumiesz znaczenie).

Rozwiązanie dla win2003 byłoby lepsze, ale jest to powtarzający się problem - jeśli istnieje czyste rozwiązanie dla IIS7, ale nie IIS6, z przyjemnością się o tym dowiem.

Edycja: Przepraszam "o niekompletne pytanie wcześniej, miałem tab + wprowadzony przypadkowo.

Odpowiedz

11

Można to zrobić całkiem łatwo za pomocą modułu URLRewrite w IIS7. Ale tak naprawdę nie wiem, czy to uniemożliwi rejestrowanie tych żądań.

<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

Witryna jest na tyle mała, że ​​dziennik IIS nie jest perfekcyjny. problem; to głównie hałas, którego nie miałbym nic przeciwko uniknięciu - ale to rozwiązanie jest dokładnie tym, na co liczyłem - jakimś konfigurowalnym modułem, który może przerwać niektóre żądania. Zajrzę do tego, dzięki! –

+0

Czy wiesz, czy można utworzyć jedną regułę dla wielu botów? – UpTheCreek

+0

@UpTheCreek Jest to wzorzec, więc jeśli masz regularne wyrażenie identyfikujące wszystkie boty, które chcesz wyszukać, możesz je tam podłączyć. Byłbym jednak ostrożny, wydaje się nieco niebezpieczny dla zabicia normalnego ruchu, jeśli nie jesteś ostrożny. –

0

Nie myśl, że możesz to zrobić z web.config (autoryzacja w web.config jest dla użytkowników, nie botów). Najlepszym rozwiązaniem byłby niestandardowy filtr ISAPI dla samego IIS. Jest blog about this here. Powodzenia!

3

Można napisać niestandardowy moduł HttpModule ASP.Net, tak jak zrobiłem dla mojej witryny, aby zablokować niektóre fałszywe boty. Oto kod:

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 
} 

musisz zarejestrować go w pliku web.config i określić wyrażenie regularne użyć aby dopasować ciągi agenta użytkownika. Oto jeden użyłem do zablokowania ruchu 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

To wygląda jeszcze bardziej jak to, czego szukałem :-) dzięki! Czy wiesz, czy to uniemożliwia rejestrowanie żądań? Prawdopodobnie nie, prawda? –

+1

Nie sprawdziłem, ale wyobrażam sobie, że widząc, jak to już przeszło przez potok ASP.Net, jest już w dziennikach – emertechie

Powiązane problemy