|
Leere User Agents per PHP oder .htaccess sperrenEin User (Benutzer), der mit einem beliebigen
Browser im Internet surft, wird sich kaum darüber Gedanken machen, dass es sich bei
seinem Browser um einen Agenten (beauftragten Vermittler) handelt, der für ihm
eine beliebige Webseite laden soll. Der Agent (Browser) ist für den Benutzer (User)
die Schnittstelle zum World Wide Web. Damit ein Webserver weiß mit wem er es zu tun hat,
übermitteln Webbrowser einige Angaben im HTTP-Header an den Server, auf dem die
angeforderte Seite als Dokument liegt. Nicht nur der Browser, auch die übermittelten
Angaben im HTTP-Header werden als User Agent bezeichnet, zumindest die Angaben, in denen
der Browser sich vorstellt. Mit Hilfe von Browserweichen ist es durch die Auswertung der
User Agents zum Beispiel möglich, für unterschiedliche Browser maßgeschneiderte Seiten
vom Webserver ausliefern zu lassen. Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Nicht nur Browser, auch "gute" Bots (Webcrawler)
geben sich im Normalfall zu erkennen und senden einen User Agenten. Von "bösen"
Bots, wie zum Beispiel von Spambots, wird zuweilen ein gefälschter User Agent gesendet
oder es werden keine Angaben (leere User Agents) übermittelt. Ein leerer User
Agent deutet jedoch nicht zwangsläufig auf einen "bösen" Bot hin, da ebenso
ein unerfahrener Programmierer ein Script gecodet haben könnte, welches keinen User
Agenten übermittelt. So ist allgemein bekannt, dass zum Beispiel der Apache Webserver
ohne Aufforderung keine User Agents über ein PHP-Script weiter verbreitet. Würden wir
nun im Browser ein PHP Script aufrufen, dass ein XML-Dokument von einem anderen Server
ladet, würde der Server, auf dem das PHP-Script ausgeführt wird, keinen User Agenten an
den Server übermitteln, auf dem das XML-Dokument liegt. Leere User Agents per .htaccess blocken: RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule .* - [F,NS,L] Alternativ können wir auch den Zugriff für einzelne
PHP-Dateien blockieren, wenn kein User Agent übermittelt wurde. <?php $einAgent = $_SERVER["HTTP_USER_AGENT"]; if (isset($einAgent) and !empty($einAgent)) { echo "Script wird ausgeführt, da User Agent übermittelt wurde.\n"; } else {echo "Script wird nicht ausgeführt, da kein User Agent übermittelt wurde.\n"; } ?> Damit die Requests eigener Scripts nicht geblockt werden
und alle Anfragen unbeantwortet bleiben, wird zuweilen empfohlen, einfach mit Hilfe der
PHP-Funktion ini_set() zur Laufzeit (Ausführungszeit des Scripts) die
Konfiguration von PHP so zu verändert, dass ein beliebiger User Agent mit dem HTTP_Header
übertragen wird. <php ini_set("user_agent", "Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/...)"); ?> Der Nachteil dieser Vorgehensweise besteht jedoch darin,
dass mit ini_set() alle empfangenen User Agents überschreiben werden, selbst wenn das
Script von einem Spambot mit leerem User Agenten aufgerufen wird. Wesentlich besser
hingegen wäre, unser Script kontrolliert zuerst ob ein User Agent übermittelt wurde und
leitet den originalen User Agenten weiter oder sendet einen eigenen. Soll der originale
User Agent durchgereicht werden, sollte dieser vorsorglich gefiltert werden. Nur durch
eine Filterung wird sichergestellt, dass das eigene Script keine mit Schadcode verseuchte
User Agents weiter verbreitet. Angriffe und Injektionen durch mit Schadcode manipulierte
User Agents soll es zumindest schon gegeben haben. <?php $einAgent = strip_tags($_SERVER["HTTP_USER_AGENT"]); $einAgent = preg_replace("/[^a-zA-Z0-9.,:;()\/+]/", " ", $einAgent); if (isset($einAgent) and !empty($einAgent)) { ini_set("user_agent", $einAgent); } ?> Obwohl innerhalb einer durch rechteckige Klammern
eingefassten Zeichenklasse nur die Zeichen \ ^ - ] eine Bedeutung als
Metazeichen besitzen, wurde im obigen Beispiel auch der / Slash maskiert, damit PHP diesen
nicht mit den gewählten Delimiter-Zeichen verwechselt. Bei Verwendung eines anderen
Zeichen als Delimeter braucht der / Slash nicht maskiert zu werden. $einAgent = preg_replace("#[^a-zA-Z0-9.,:;()/+]#", " ", $einAgent); Ob die eingehenden User Agents durchgereicht werden sollen
oder ob ein eigener User Agent gesendet werden soll, ist vom Einzellfall abhängig.
Handelt es sich um ein kleines PHP-Script, dass fest in einer HTML-Seite eingebunden ist,
die im Browser aufgerufen wird und dieses Script verarbeitet lediglich für diese eine
HTML-Seite ein XML-Dokument, so kann der User Agent durchgereicht werden, da ja praktisch
die im Browser aufgerufene Seite der Auslöser für den Request ist und PHP lediglich ein
Verarbeitungsgehilfe. Handelt es sich aber um eine richtige Anwendung oder um ein Script,
auf das von vielen Seiten zugegriffen wird, sollte das Script sich als Script zu erkennen
geben und einen eigenen User Agenten senden. <?php function proRES($antwort){ $einAgent = $_SERVER["HTTP_USER_AGENT"]; if (isset($einAgent) and !empty($einAgent)) { $einAgent = "Mozilla/5.0 (compatible; Name-des-Scripts/PHP; ". "+http://www.ex.....de/beschreibung.php)"; $hotshot = curl_init($antwort); curl_setopt($hotshot, CURLOPT_HEADER, false); curl_setopt($hotshot, CURLOPT_USERAGENT, $einAgent); curl_setopt($hotshot, CURLOPT_RETURNTRANSFER, true); $eingang = curl_exec($hotshot); $infogen = curl_getinfo($hotshot, CURLINFO_HTTP_CODE); curl_close($hotshot); If ($infogen === 200 or $infogen === 301){$antwort = $eingang; } else {$antwort = $infogen;} return $antwort; } else {$antwort = false;} return $antwort; } ?> Verarbeitung oder Ausgabe: <?php $daten = "http://www.ex.....de/seite.xml"; $datast = proRES($daten); if (strlen($datast) > 3) {echo $datast."\n";} else {exit ("HTTP Statuscode: ".$datast."\n");} ?> Eine Verarbeitung und Ausgabe der angeforderten Datei erfolgt nur wenn der Server die Anfrage mit einem HTTP-Statuscode 200 für OK oder mit 301 für eine saubere Weiterleitung beantwortet hat. In allen anderen Fällen wird nur der HTTP-Statuscode ausgegeben und die weitere Ausführung des Scripts beendet. |
Finden und - Optimierung -
Übersicht Amazon Web
Service Images/Bilder prüfen |
|||||||||||
Copyright © 2006 - Verlag Horst Müller - Stendal | Datenschutz | Nutzungsbedingungen | |||||||||||||