Home Sitemap Impressum
SEO Welten - Webcoding, Editoren, Scripte und Anwendungen
SEO Welten

 

 
AGB
Buchempfehlungen

Leere User Agents sperren und eigenen User Agent senden

Leere User Agents per PHP oder .htaccess sperren

Ein 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.

Im Beispiel ein User Agent des Firefox:

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.

Möchten wir unsere Webseiten vor Zugriffen von Bots und Scripts schützen, die keine User Agents mitsenden, besteht die einfachste Möglichkeit darin, alle Requests (alle Anfragen) mit leeren User Agents mit der Konfigurationsdatei .htaccess ins Nirwana umzuleiten.

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.

Leere User Agents per PHP blocken:

<?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.

Senden eines User Agents mit Hilfe der Funktion ini_set():

<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.
Im Beispiel werden zuerst mit Hilfe der PHP-Funktion strip_tags() eventuell vorhandene HTML-Tags entfernt. Im zweiten Schritt werden alle für User Agents untypische Zeichen entfernt, bevor die restlichen Parameterwerte als neuer (durchgereichter) User Agent gesendet wird.

Codeschnipsel für Filterung und senden eines User Agenten:

<?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.

Beispiel Delimiter:

$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.

Im Beispiel wird kontrolliert, ob der User Agent einen Wert enthält. Falls dies der Fall ist, wird ein Request mit einem eigenen User Agenten gesendet. Der User Agent gibt darüber Auskunft, dass das Laden der geparsten Seite mit allen Browser möglich ist, die mit Mozilla kompatibel sind. Weiterhin enthält der User Agent den Namen der Anwendung bzw. des Scripts und verweist auf eine Seite mit weiteren Informationen.

Coderbeispiel mit cURL und eigenem User Agent:

<?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.

Navigation

Finden und
gefunden werden ...


Autoritäten im
Internet

Die Kehrseite
Das Wesen

Zukunftsaussichten

Studien & Strategien
Verbreitung & Bedeutung
Internet & Medien


- Optimierung -

Einstieg Optimierung
Erfolg oder Misserfolg

 

Webcoding

Übersicht

Einführung ins Thema


Amazon Web Service
Request und Response
Anfragen und Anträge
Weitere Beispiele
Einfaches Script mit cURL
Einfaches Script - Unicode
Einfaches Script - ISO
Weitere Einzelheiten


Images/Bilder prüfen


Copyright © 2006 - Verlag Horst Müller - Stendal | Datenschutz | Nutzungsbedingungen