registrieren registriertes Mitglied


Anzeige

Anzeige

Wie man ("bad") Bots blocken kann - Neuer Versuch

Alles über Google diskutieren wir hier.
supervisior
PostRank 10
PostRank 10
Beiträge: 3389
Registriert: 26.06.2006, 09:11

Beitrag supervisior » 29.11.2022, 16:57 Wie man ("bad") Bots blocken kann - Neuer Versuch

Nachdem es vor mehreren Monaten zu einem heftigen Disput geführt hat als ich einen Thread mit dem gleichen Thema veröffentlicht hatte, unternehme ich nun einen erneuten Versuch. Im nachhinein muss ich eíngestehen, dass mein erster Lösungsversuch nur bedingt geeignet war, um böse Bots tatsächlich gesichert blocken zu können, wobei "böse" natürlich relativ ist und das ein jeder für sich selbst entscheiden muss welcher Bot nun böse ist oder nicht. Ich für meinen Teil ist der Bot böse, der nicht dazu beiträgt, dass ich durch seinen Zugriff einen Vorteil habe. Dadurch reuziert sich für mich die Liste der guten Bots auf Google, Bing und noch ein paar handverlesene andere.

Generell ist das Thema unerwünschte Bots, Crawler, Scraper usw. zu blocken uralt. Allerdings gibt es nicht wirklich brauchbare Lösungen, zumindest sind mir keine bekannt. Von daher beschränkt sich die Blockerei darauf User-Agents oder IP Adressen auf eine Blockliste zu setzen und diese Liste durch welche Mittel auch immer dafür zu verwenden, um den Zugriff zu blockieren. Sowohl IPs als auch der User-Agent sind aber in hohem Maße fehlertolerant. Zumal diese Methodik dem Kampf gegen Windmühlen gleichkommt, weil so eine Liste weder aktuell noch vollständig sein kann. In jedem Fall macht es nur wenig Sinn mit dieser Methodik zu arbeiten.

Mein seit Jahren währendes Ziel war es einen vergleichsweise einfachen Filter zu schaffen, der im Idealfall mit ein paar Zeilen Code auskommt und ich nicht ständig irgendwelche Filterlisten pflegen muss. Im Frühjahr diesen Jahres bin ich dann zufällig auf die Sec-Fetch-* Request Header aufmerksam geworden, die inzwischen von allen Browsern bei jedem Request gesendet werden. Eine Ausnahme davon macht leider der Safari Browser auf dem Mac, was sich aber als kein sonderliches Problem darstellt.

Das Besondere an diesen Sec-Fetch-* Headern ist nun, dass diese Header nur von den Browsern gesendet werden hinter denen sich ein realer User verbirgt. Bots, Crawler, Scraper und ähnliches maschinengetriebenes Zeugs verwenden diese nicht. Nachdem ich seit inzwischen 10 Monaten alle Zugriffe in gesonderte Logfiles schreibe und dabei differenziere, welcher Request diese Header sendet, bzw. nicht sendet, kann ich mit 99,999999%iger Sicherheit sagen, dass ich keinen Zugriff falsch geblockt hätte. Das es nicht 100% sind, liegt daran, dass es 1 und immer nur 1 ganz bestimmten Bot gibt, der einen echten User tatsächlich so gut immitiert, dass ich nur an Hand der Bildschirm Auflösung erkennen kann, dass das kein natürlicher User sein kann. Einen Bildschirm mit 1024 x 1024 Auflösung gibt es meines Wissens nicht, obwohl ich am Nutzerverhalten und einer besonderen Vorrichtung meiner Webseiten erkennen kann, dass dieser User maschinengetrieben ist.

Die Lösung sieht nun also so aus, dass man an Hand der besagten Sec-Fetch-* Header feststellen kann, ob es sich bei einem Zugriff um einen natürlichen Nutzer handelt. Wie bereits erwähnt, unterstützt der Safari Browser diese Header bislang nicht. Das bdeutet, dass man diesen Browser auf eine Ausnahme Liste setzen muss, jedoch man dabei zwischen einem echten Safari Nutzer und dem Applebot unterscheiden muss, weil letzterer den gleichen UA verwendet. Nachdem es nach meinen Erfahrungen aus den letzten 20 Jahren unüblich ist, dass Bots den Safari Browser auf dem MAc als UA verwenden und mir noch nie untergekommen ist, ergibt sich daraus kein Nachteil.

Der ganz entscheidende Punkt ist nun Ausnahmen zu schaffen, eben um zu verhindern, dass man nicht den Falschen blockt, also die guten Bots oder was auch immer man für gut hält. Wie bereits erwähnt, habe ich diesen Filter inzwischen seit 9 Monaten im Einsatz und bislang konnte ich kein fälschlichweises blocken feststellen. Dazu nehme ich mir fast jeden Tag eine halbe Stunde Zeit, um die o.g. Logfiles zu überprüfen. Um das Genze abzusichern, habe ich Matomo so umfunktioniert, dass ich Zugriffe mit den genannten Headern und ohne getrennt voneinander tracken kann. Letzteres ist mit der Matomo Tracking API möglich, womit es kein Javascript braucht, um solche Requests tracken zu können. Mit dieser Matomo API ist es mir möglich auch !=200 Zugriffe zu tracken. Ich sehe damit in Matomo all das, was ich normalerweise nur über die access_log sehen würde.

Die oben beschriebene Lösung lässt sich mit ein paar Zeilen Code sowohl per PHP lösen, aber auch mittels .htaccess, sodass dadurch keine Server Resourcen für das Filtern verbraucht werden. Dreh- und Angelpunkt sind die Ausnahmen, aber die sind überschaubar gering und bedürfen in der Regel (fast) keine Pflege. Ich habe meine Ausnahmen seit 9 Monaten nicht mehr geändert. Warum auch? Eine neue Suchmaschine, die Google oder Bing gleichkommt, gibt es meines Wissens nicht, aber das sind nur meine Maßstäbe.

Anzeige von: