XML-Sitemap schützen

Seit es die sinnvolle Erweiterung des Sitemaps.org-Standards gibt, die erlaubt, dass man den Pfad zu seiner Sitemaps-Datei in der robots.txt hinterlegt und sich diese nicht für jede Suchmaschine einzeln anmelden, authentifizieren und einreichen muss, ist leider auch die Gefahr gestiegen, dass Scraper und sonstiger Webabschaum sich dort bedient. Gerade Contentdieben wird es so sehr leicht gemacht – die Seitenstruktur liegt offen vor ihnen und muss nicht erst mühsam zusammengecrawled werden.

Ich bin bei den meisten unserer Projekte jetzt dazu übergegangen, nur noch den etablierten Suchmaschinen Zugriff auf die Sitemaps-Dateien zu gewähren. Dies ist zwar nicht unbedingt schön, da so neue, noch kleine Suchmaschinen benachteiligt werden aber in Abwägung der Vorteile war es mir das wert.

Umgesetzt wird diese Zugriffskontrolle über Cloaking: Google, Yahoo, Microsoft und Ask.com erhalten die Sitemap, andere Clients eine Fehlermeldung. Auch wenn Cloaking eigentlich nicht gerne gesehen wird, so ist es hier legitim, da es nicht zum Ziel hat, User oder Suchmaschinen zu täuschen.

<?php

if(preg_match('/(Googlebot|Slurp|Jeeves|msnbot)/'$_SERVER['HTTP_USER_AGENT']) 
&& 
preg_match('/(\.googlebot\.com|\.yahoo\.net|\.inktomisearch\.com|\.ask\.com|\.live\.com)$/'gethostbyaddr($_SERVER['REMOTE_ADDR'])) 
&& (
gethostbyname(gethostbyaddr($_SERVER['REMOTE_ADDR'])) == $_SERVER['REMOTE_ADDR'])) {

    include(
'/path/to/real/sitemapfile.xml');    

} else {

    
header('HTTP/1.1 403 Forbidden');
    echo 
'<html><head><title>Zugriff verweigert</title></head><body><h1>Zugriff verweigert</h1>
    Der Zugriff auf unsere Sitemaps ist nur den g&auml;ngigen Suchmaschinen erlaubt. Bitte
    besuchen Sie die <a href="http://'
.$_SERVER['HTTP_HOST'].'">Startseite</a>.</body></html>';

}

?>

Der PHP-Code prüft zuerst, ob im User-Agent des Clients in Hinweis darauf vorhanden ist, dass es sich um einen Bot der vier großen Suchmaschinen handelt. Dann wird über die mittlerweile von allen großen Suchmaschinen unterstütze Authentifizierung der Crawler mittels DNS/Reverse-DNS-Check geprüft, ob der Crawler auch „echt“ ist. Sollte dies alles zutreffen, wird die Sitemaps-Datei ausgegeben, andernfalls gibt es eine Fehlermeldung. Sehen kann man das zum Beispiel auf dieser Domain: sitemap.xml
Eintrag geschrieben am 10.06.2007 um 11:25 Uhr - Trackback-URL - Tags: Sitemap Sitemaps Sitemaps.org Tools

Kommentare & Trackbacks

joghurtKULTUR - 10.06.2007 13:14
Netter Tipp, aber versteh ich das nun richtig? Laut deinem Code muß ich dem Apachen erst beibringen das er XML-Files wie PHP parsen soll? Der von dir gepostete Code muß dann in eine Datei namens sitemap.xml welche im bedarfsfall die echte XML-Datei includet und an den Client ausliefert? (Ist noch früh am morgen :-))

Johannes Johannes - 10.06.2007 13:18
Kommt sicherlich immer auf die praktische Umsetzung im konkreten Projekt an. Hier auf der Domain läuft das so:

In der .htaccess steht folgende Rewrite-Rule:

RewriteRule ^sitemap.xml$ sitemap.php

In der sitemap.php dann der obrige Code, anstelle des includes habe ich bei mir jetzt halt den PHP-Code, der die normale XML-Sitemap generiert (Blogurls raussuchen, in XML packen, ausliefern). Wenn man eine statische, fertige XML-Sitemap hat, nennt man die halt um in altetollexmlsitemap.xml und included die in der sitemap.php

joghurtKULTUR - 10.06.2007 13:23
Ah jetzt ja, eine Insel :-) Danke dir. An das URL-Rewriting hab ich nun garnicht gedacht :-) das werd ich doch einfach mal antesten, danke dir jedenfalls für den Tipp

Axel - 10.06.2007 15:48
Na ob das was bringt? Wenn ich Content klaue bin ich immer als 'Googlebot' unterwegs. ;-)

Johannes Johannes - 10.06.2007 15:49
Mag sein, durch die Prüfung wirst du damit allerdings nicht kommen, da du keinen Zugriff auf die Zonefiles für die Domain googlebot.com hast.

Pelle Boese - 10.06.2007 22:54
Bei

preg_match('/(googlebot\.com|yahoo\.net|ask\.com|live\.com)$/', gethostbyaddr($_SERVER['REMOTE_ADDR']))

würde ich dann noch einen . vor die einzelnen Domains machen, sonst kann man z.B. auch mit einer IP die auf "mein-eigener-googlebot.com" auflöst die Sitemap abholen.

Axel - 11.06.2007 08:57
Sorry - den DNS-Check habe ich gestern total übersehen. Ist so eine super Lösung.

Frank - 12.06.2007 07:55
Die Idee ist super. Ich sträube mich natürlich ein wenig gegen den zusätzlichen Aufwand mit folgenden Logik: Ich schätzte Contentdiebe bislang so ein, dass sie sich vielleicht sowieso erst ein ganzes Projekt ziehen, also die Seite eh komplett durchgehen. Oder themenrelevante Inhalte suchen und dabei gezielt über Google auf Einzelseiten kommen. Die hier angegebene Version dürfte also nur gegen die gerichtet sein, die sich sowieso schon bedienen und in der Sitemap nach Aktualisierungen suchen. Oder irre ich mich hier?

Johannes Johannes - 12.06.2007 12:01
Frank, das Problem sehe ich darin, dass man über dieses "Auto-Discovery-Feature", also die Angabe der URI zur kompletten Sitemap in der robots.txt, jetzt sehr schnell an die Struktur der Seite kommt. Das war früher so nicht möglich und ich kann mir vorstellen, dass das recht bald auch im großen Stil ausgenutzt wird. Ich habe bereits die ersten "Benutzer", die in der robots.txt nach der Sitemap gesucht haben und dann auch versuchten, diese aufzugrufen - und das wird bei vielen vermutlich nicht aus wissenschaftlichem Interesse passieren.

Sven - 12.06.2007 14:48
Warum einfach, wenns auch kompliziert geht?

Wenn man die Sitemap unbedingt auf den Namen Sitemap.xml taufen muss, dann ist es ja klar, wenn die Sitemap auch von anderen Bots gefunden wird. Den Namen für die Datei gibt ja schließlich jeder ein!

Benennt man die Datei einfach um, z.B.:

klfjsdoj908.xml

Dann sollte auch kein fremder Bot drauf kommen, dass diese Datei überhaupt existiert. Verzeichnis Browsing hat ja wohl kaum jemand an!

Johannes Johannes - 12.06.2007 14:50
Sven, das ist richtig. Allerdings gibt es ja für das Sitemaps-Protokoll mittlerweile eine Erweiterung, die auf den Namen "Autodiscovery" hört. Dabei schreibt man in seine robots.txt die Zeile "Sitemap: http://www.example.org/sitemapfile.xml" und die Crawler der Suchmaschinen und _alle_, die sich die robots.txt ansehen, lesen das dann aus. Deine Version funktioniert, wenn man die Sitemap für jedes Projekt und jede Suchmaschine eigenhändig bei den Suchmaschinen anmelden möchte.

Sven - 12.06.2007 16:43
So, bin jetzt mal wieder schlauer ;-)

Makkus - 14.06.2007 11:44
Hey Johannes.

Du darfst *.inktomisearch.com in Deiner PHP-Blocker-Routine nicht vergessen 8-) Bei mir crawled der mehr als yahoo.net.

Johannes Johannes - 14.06.2007 11:48
Yahoo hat ja eigentlich von einiger Zeit angekündigt, von inktomisearch.com auf yahoo.net zu wechseln . In Zukunft wird man deswegen vermutlich nur noch yahoo.net-hosts sehen aber für die Übergangszeit kann es natürlich sinnvoll sein, inktomi noch mit reinzunehmen, Danke für den Hinweis.

Gregor - 27.01.2008 20:23
Ist der Code noch aktuell?

Kann ich das Ganze auch mit sitemap.gz realisieren?

Johannes Johannes - 27.01.2008 20:26
Gregor, der Code ist noch aktuell. Ob du nun eine komprimierte Sitemap durchreichst oder nicht, dürfte egal sein - eventuell musst du die Header anpassen.

Gregor - 28.01.2008 08:59
In wie fern muss ich die Header anpassen? Kannst Du mir ein Beispiel zeigen?


Kommentieren?Kommentieren?
Dieser Blogbeitrag ist älter als 30 Tage. Leider mussten wir die Kommentarmöglichkeit für alte Beiträge deaktivieren, da sie regelmäßig von Spammern zum Abladen ihrer Links mißbraucht wurde. Angemeldete Benutzer haben weiterhin die Möglichkeit, auch ältere Beiträge zu kommentieren. Jetzt kostenlos anmelden.
SucheSuche