XML-Sitemap schützen

johannes beus
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

Johannes Beus

Johannes Beus, Gründer und Geschäftsführer von SISTRIX, beschäftigt sich seit 2001 mit der Optimierung von Webseiten für Suchmaschinen. Auf einem der ältesten deutschsprachigen SEO-Blog veröffentlicht er seit 2003 regelmäßig Zusammenfassungen eigener Auswertungen und Einschätzungen des SEO-Marktes.
Eintrag geschrieben am 10.06.2007 um 11:25 Uhr - Trackback setzen - Tags: Tools
joghurtKULTUR
1
schrieb am 10.06.2007 um 13:14 Uhr
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 :-))

sistrix
2
schrieb am 10.06.2007 um 13:18 Uhr
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
3
schrieb am 10.06.2007 um 13:23 Uhr
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
4
schrieb am 10.06.2007 um 15:48 Uhr
Na ob das was bringt? Wenn ich Content klaue bin ich immer als 'Googlebot' unterwegs. ;-)

sistrix
5
schrieb am 10.06.2007 um 15:49 Uhr
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
6
schrieb am 10.06.2007 um 22:54 Uhr
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
7
schrieb am 11.06.2007 um 08:57 Uhr
Sorry - den DNS-Check habe ich gestern total übersehen. Ist so eine super Lösung.

Frank
8
schrieb am 12.06.2007 um 07:55 Uhr
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?

sistrix
9
schrieb am 12.06.2007 um 12:01 Uhr
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
10
schrieb am 12.06.2007 um 14:48 Uhr
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!

sistrix
11
schrieb am 12.06.2007 um 14:50 Uhr
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
schrieb am 12.06.2007 um 16:43 Uhr
So, bin jetzt mal wieder schlauer ;-)

Makkus
13
Makkus
schrieb am 14.06.2007 um 11:44 Uhr
Hey Johannes.

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

sistrix
14
schrieb am 14.06.2007 um 11:48 Uhr
Yahoo hat ja eigentlich von einiger Zeit http://www.ysearchblog.com/archives/000426.html">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
15
Gregor
schrieb am 27.01.2008 um 20:23 Uhr
Ist der Code noch aktuell?

Kann ich das Ganze auch mit sitemap.gz realisieren?

sistrix
16
schrieb am 27.01.2008 um 20:26 Uhr
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
17
Gregor
schrieb am 28.01.2008 um 08:59 Uhr
In wie fern muss ich die Header anpassen? Kannst Du mir ein Beispiel zeigen?


Kommentieren?

mehr
Die Kommentare für diesen Beitrag wurden geschlossen. Angemeldete Benutzer haben weiterhin die Möglichkeit, auch ältere Beiträge zu kommentieren. Jetzt kostenlos anmelden