anyone: Besucher mit russischen Referer sperren

Hi,

Auf grund massivem Refererspam von russischen Seiten möchte ich gerne alle Besucher die laut Referer von *.ru Seiten kommen per .htaccess sperren.

Leider blockiert das Script von Wikipedia alle Besucher

RewriteEngine on
RewriteCond %{HTTP_REFERER} .ru [OR]
RewriteRule .* - [forbidden,last][

Während ein anderes Script die Bots trotzdem nicht blockt:

RewriteCond %{HTTP_REFERER} ^http://.*.[ru]/ [NC,OR]
RewriteRule .* - [F,L]

Was mach ich falsch?
Danke fürs Reinschaun :)

  1. Hi,

    Was mach ich falsch?

    Kann ich dir leider nicht sagen, dafür beschäftige ich mich zu wenig mit htaccess. Ich kann dir aber GeoIP empfehlen. Dieses Apache-Modul sperrt wirklich alle Aufrufe aus Ländern die du nicht haben möchtest.

    Gruß

    1. Ich kann dir aber GeoIP empfehlen. Dieses Apache-Modul sperrt wirklich alle Aufrufe aus Ländern die du nicht haben möchtest.

      Nein, es versucht das nur und wird eine "große" Anzahl von Zugriffen blockieren, die nicht blockiert werden sollten und eine "große" Anzahl von Zugriffen nicht blockieren, die die eigentlich blockiert werden sollten. Auch hier muss "anyone" die Regeln nach noch selbst formulieren. Du versprichst ihm etwas zu viel.

      Die Frage ist also schon, ob sich der Aufwand hinsichtlich des zu erwarten Ergebnisses lohnt.

      Zu dem muss "anyone" das Modul GeoIP installieren können oder sich einen Hoster suchen müssen, der es installiert hat. Um es installieren zu können braucht er einen eigenen (virtuellen) Server. Ferner wird er regelmäßig Updates der  GeoIP.dat laden müssen. Ich bezweifle hinsichtlich der Ausgangsfrage sehr ernsthaft, dass es sinnvoll und angemessen ungefährlich ist wenn er auf diesem Wissensstand einen eigenen (virtuellen) Server administriert.

      Jörg Reinholz

  2. Auf grund massivem Refererspam von russischen Seiten möchte ich gerne alle Besucher die laut Referer von *.ru Seiten kommen per .htaccess sperren.

    Und Du glaubst nicht, dass es auch (vermeintlich) russische Seiten gibt, die eine Daseinsbereichtigung haben?

    Leider blockiert das Script von Wikipedia alle Besucher

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} .ru [OR]
    RewriteRule .* - [forbidden,last][

    Du blockiert alle Aufrufe von einem referer, der

    .    ein beliebiges Zeichen
    r    gefolgt von einem r
    u    gefolgt von einem u
    [or] oder (Was oder?) Wenn Du keine Bedingung formulierst, dann ist das wahr.

    Schon wegen dem [or] werden allebesucher blockiert, Du würdest aber auch Besucher, die von einem Link auf Deiner eigenen Seite kommen, wenn deren URL http://exemple.com/wolfsrudel.html wäre.

    Während ein anderes Script die Bots trotzdem nicht blockt:

    RewriteCond %{HTTP_REFERER} ^http://.*.[ru]/ [NC,OR]
    RewriteRule .* - [F,L]

    Du blockiert alle Aufrufe von einem referer, der
    ^http://    mit http:// beginnt, worauf
    .*          beliebige Zeichen folgen, danach
    .          ein Punkt
    [ru]        gefolgt von einem r ODER einem U (also NICHT wie gedacht r, gefolgt von u), gefolgt von
    /           Slash

    Das würde also Aufrufe mit einem Referer blocken, die von

    http://example.r/
    http://example.u/
    kommen. Nicht jedoch von http://example.u/

    Was mach ich falsch?

    1. Hilfreichere Antwort:

    Genau genommen solltest Du Dein Vorgehen genauer überlegen. Solltst Du entgegen jeder Vernunft und meines als Frage formulierten Argumentes beim Blockieren via .htaccess bleiben wollen, dann wirst Du Dich mit regulären Ausdrücken befassen müssen. Ich hoffe aber, Du hast Dich anders entschieden.

    Eigentlich willst Du ja Bots blocken. Versuche andere Merkmale zu finden (deren IP-Adressen, als was für ein User-Agent geben die sich aus etc. Da finden sich Merkmale. Außerdem benutzt Du wahrscheinlich etwas wie Wordpress. Sicherlich gibts für Deine Software eine Erweiterung, die solchen Spam besser blockt als Du es gegenwärtig hinbekommen würdest.

    2. Deutlich weniger hilfreichere Antwort:

    Ganz grob gesagt, Du wolltest eigentlich etwas wie z.B.

    RewriteCond %{HTTP_REFERER} ^http://.*.ru/
    RewriteRule .* - [forbidden,last]

    Ich hoffe, das ist nur fürs Archiv un nicht für Deine .htaccess.

    Jörg Reinholz

    1. Hi,

      Derzeit versuche ich zu aus zu werten wie viele meiner Besucher von welchen Seiten kommen, daher vielen Dank für deine nicht hilfreiche Antwort ;)
      Um Bots aus zu sperren bietet http://www.spider-trap.de/ eine interessante Umsetzung. Ich habe zwar unlimited Traffic aber will trotzdem keinen Rausschmiss seitens meines Providers riskieren...Bots machen inzwischen ja fast 50% der Besucher aus...rufen aber zum Glück keine per js verlinkte Inhalte ab...

      Grüssle

      1. Hm

        RewriteEngine on
        RewriteCond %{HTTP_REFERER} ^http://.*.ru/
        RewriteRule .* - [forbidden,last]

        in der .htaccess Blockiert auch alle Aufrufe...

        1. RewriteEngine on
          RewriteCond %{HTTP_REFERER} ^http://.*.ru/
          RewriteRule .* - [forbidden,last]
          in der .htaccess Blockiert auch alle Aufrufe...

          Definiere "Blockiert alle Aufrufe".

          Wird eventuell ein Fehler geworfen? Fehler 500 vielleicht? Bei mir blockiert das nicht "alle Aufrufe".

          Teste das mit wget, da kannst Du auch Referer simulieren.

          htaccess auf localhost wie beschrieben.

          Versuch 1 mit http://test.de/ als Referer:

          fastix@trainer:/srv/www/htdocs$ wget -d --spider --referer="http://test.de/" http://localhost/
          Setting --spider (spider) to 1
          Setting --referer (referer) to http://test.de/
          DEBUG output created by Wget 1.13.4 on linux-gnu.

          URI encoding = »UTF-8«
          Spider-Modus eingeschaltet.  Prüfe ob die Datei auf dem Server existiert.
          --2013-02-17 16:19:01--  http://localhost/
          Auflösen des Hostnamen »localhost (localhost)«... 127.0.0.1
          Caching localhost => 127.0.0.1
          Verbindungsaufbau zu localhost (localhost)|127.0.0.1|:80... verbunden.
          Created socket 3.
          Releasing 0x0000000000cfc270 (new refcount 1).

          ---request begin---
          HEAD / HTTP/1.1
          Referer: http://test.de/
          User-Agent: Wget/1.13.4 (linux-gnu)
          Accept: */*
          Host: localhost
          Connection: Keep-Alive

          ---request end---
          HTTP-Anforderung gesendet, warte auf Antwort...
          ---response begin---
          HTTP/1.1 200 OK

          Versuch 2 mit http://test.ru/ als Referer:

          fastix@trainer:/srv/www/htdocs$ wget -d --spider --referer="http://test.ru/" http://localhost/
          Setting --spider (spider) to 1
          Setting --referer (referer) to http://test.ru/
          DEBUG output created by Wget 1.13.4 on linux-gnu.

          URI encoding = »UTF-8«
          Spider-Modus eingeschaltet.  Prüfe ob die Datei auf dem Server existiert.
          --2013-02-17 16:18:49--  http://localhost/
          Auflösen des Hostnamen »localhost (localhost)«... 127.0.0.1
          Caching localhost => 127.0.0.1
          Verbindungsaufbau zu localhost (localhost)|127.0.0.1|:80... verbunden.
          Created socket 3.
          Releasing 0x0000000000706270 (new refcount 1).

          ---request begin---
          HEAD / HTTP/1.1
          Referer: http://test.ru/
          User-Agent: Wget/1.13.4 (linux-gnu)
          Accept: */*
          Host: localhost
          Connection: Keep-Alive

          ---request end---
          HTTP-Anforderung gesendet, warte auf Antwort...
          ---response begin---
          HTTP/1.1 403 Forbidden

          Beide mal das erwartete Ergebnis.

          1. Hm ich bekomm den 403 Zugriff verboten sowohl beim direkten Aufruf der Seite ohne Refera und auch beim Aufruf über den Link von einer .com URL...ne Idee warum???

            1. Hm ich bekomm den 403 Zugriff verboten sowohl beim direkten Aufruf der Seite ohne Refera und auch beim Aufruf über den Link von einer .com URL...ne Idee warum???

              Woher, bitte, soll ich das wissen, wenn Du mir nichts zeigts?

              Sperrt vieleicht eine robots.txt auch das Programm wget aus? Das liese sich beheben.
              Ich brauche die komplette htaccess und die (beide!) URLs. Hinweis: Ich werde das testen!

              Und ich müsste wissen, ob es noch etwas gibt, was den Zugriff verbieten könnte. Denn ich habe verdammt viele Ideen, warum das Ereignis eintreten KÖNNTE.

              Jörg Reinholz

              1. Hallo,

                Sperrt vieleicht eine robots.txt auch das Programm wget aus?

                wohl kaum, denn die robots.txt ist eine gewöhnliche Textdatei, die vom Client explizit angefordert, abgeholt und interpretiert werden muss. Anständige Bots tun das, aber wget fragt direkt die angegebene URL ab. Eine eventuell existierende robots.txt bliebe wirkungslos.

                Ciao,
                 Martin

                --
                Ordnung ist, wenn man etwas findet, was man gar nicht sucht.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo,

                  Sperrt vieleicht eine robots.txt auch das Programm wget aus?

                  wohl kaum, denn die robots.txt ist eine gewöhnliche Textdatei, die vom Client explizit angefordert, abgeholt und interpretiert werden muss. Anständige Bots tun das, aber wget fragt direkt die angegebene URL ab. Eine eventuell existierende robots.txt bliebe wirkungslos.

                  Aus meiner /etc/wgetrc

                  Setting this to off makes Wget not download /robots.txt.  Be sure to

                  know *exactly* what /robots.txt is and how it is used before changing

                  the default!

                  #robots = on

                  Ich wollte schon was sagen, dann habe ich in dem manpages zu wget nachgelesen:

                  ... This is sometimes referred to as "recursive downloading."  While doing that, Wget respects
                  the Robot Exclusion Standard (/robots.txt).

                  Ok. Im konkreten Fall hast Du Recht. ... Aber nicht in jedem.[*grummel*]

                  Jörg Reinholz

                  1. Hi,

                    Aus meiner /etc/wgetrc

                    ich wusste bis eben nicht, dass es eine solche Konfigurationsdatei gibt. Vielleicht, weil ich wget aus meiner Zeit als Windows-Anwender kenne, und das Tool dort eine einzelne ausführbare Datei ohne Config und weitere Dependencies ist.

                    ... This is sometimes referred to as "recursive downloading."  While doing that, Wget respects
                    the Robot Exclusion Standard (/robots.txt).
                    Ok. Im konkreten Fall hast Du Recht. ... Aber nicht in jedem.[*grummel*]

                    In Ordnung. Der Fall, in dem ich nicht Recht hätte, war mir bis dato nicht geläufig.
                    Also haben wir beide dazugelernt. :-)

                    Ciao,
                     Martin

                    --
                    Alleine sind wir stark ...
                    gemeinsam sind wir unausstehlich!
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    1. Hi,

                      Tja meine .htaccess besteht nur aus den weiter vorne genannten drei Zeilen. Da damit jedoch warum auch immer selbst direkte Zugriffe etc blockiert wurden, habe ich sie natürlich sofort wieder entfernt...

                      Grüssle

                      1. Tja meine .htaccess besteht nur aus den weiter vorne genannten drei Zeilen.

                        Du meinst

                        RewriteEngine on
                         RewriteCond %{HTTP_REFERER} ^http://.*.ru/
                         RewriteRule .* - [forbidden,last]

                        Da damit jedoch warum auch immer selbst direkte Zugriffe etc blockiert wurden, habe ich sie natürlich sofort wieder entfernt...

                        1.)
                        Mit welchem Statuscode?

                        2.)
                        Hieß das Testverzeichnis zufällig "/nicht_von.ru/"? - Dann würde der reguläre Ausdruck nämlich immer greifen, wenn Du darin auf einen Link klickst, der auf das gleiche Verzeichnis verweist...

                        3.)
                        Weil ich ohne verififiziere Daten nicht beurteilen kann hatte ich nach den Rückgaben von wget gefragt.

                        4.)
                        Hilfreich können auch die zu den zurückgewiesenen Zugriffen gehörenden Daten aus dem Error-Log des Apache sein. Bitte auch posten.

                        Jörg Reinholz

    2. Kleine Korrekturen:

      Du blockiert alle Aufrufe von einem referer, der

      [an beliebiger Stelle]

      .    ein beliebiges Zeichen
      r    gefolgt von einem r
      u    gefolgt von einem u
      [or] oder (Was oder?)

      [enthält]

      Wenn Du keine Bedingung formulierst, dann ist das

      [stets]

      wahr.

      Schon wegen dem [or] ohne nachfolgende Bedingung werden alle Besucher blockiert. Du würdest ohne das [or] mit dieser Regel aber auch alle Besucher, die von einem Link auf Deiner eigenen Seite kommen, wenn deren URL
      http://exemple.com/wolfsrudel.html wäre.
                              ==

      Du blockiert alle Aufrufe von einem referer, der
      ^http://    mit http:// beginnt, worauf
      .*          beliebige Zeichen folgen, danach
      .          ein Punkt,
      [ru]        gefolgt von einem r ODER einem U (also NICHT wie gedacht r, gefolgt von u), gefolgt von
      /           Slash

      [enthält]

      Das würde also Aufrufe mit einem Referer blocken, die von

      http://example.r/
      http://example.u/

      kommen. Nicht jedoch solche von http://example.ru/

      Jörg Reinholz

  3. Hallo!

    Hi,

    Auf grund massivem Refererspam von russischen Seiten möchte ich gerne alle Besucher die laut Referer von *.ru Seiten kommen per .htaccess sperren.

    Leider blockiert das Script von Wikipedia alle Besucher

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} .ru [OR]
    RewriteRule .* - [forbidden,last][

    Meines Erachtens ist das keine effektive Lösung. Bei massiven Attacken sollten die Serverlogs ausgewertet werden und gezielt die Angreifer z.B. per Firewall (s.a. IPTABLES oder notfalls auch scriptseitig blockiert werden.

    Da es sehr aufwändig ist, ständig die Logs zu studieren, können auch Regeln für iptables definiert werden, die Angreifer automatisch unter gewissen Voraussetzungen blockieren.

    Selbst verwende ich ein PHP-Script mit dem ich IPs, Ratio, Menge der Zugriffe/Tag, Referer, user-agent usw ermittle und gegebenenfalls auch optisch (blinkende leuchten usw) aufmerksam gemacht werde, wenn ungewöhnliche Umstände auftreten. Dann setzte ich gewissen Regeln, die auf den Angreifer zutreffen und per Cron wird laufend eine Blocklist aktualisiert.

    Das könnte z.B. sein: Ratio < 0.8sec, empty user-agent, geo-ip ru usw. In den Logs erkennt man nicht ausgewiesene Bots meist gut, da sie in der Regel browsertypische Merkmale schlampig oder gar nicht simulieren und nur Scripte ziehen, nicht aber andere Dateien, auf die ein Browser zugreifen würde, wie z.B. css, js, Bilder usw.

    LG,
    Jonny 5