XML-Sitemap schützen

Johannes Beus
Johannes Beus
Johannes Beus ist Gründer und Geschäftsführer von SISTRIX.

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

Ähnliche Beiträge
Kommentare
Avatar joghurtKULTUR   
10. Juni 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 :-))

Avatar Johannes   
10. Juni 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

Avatar joghurtKULTUR   
10. Juni 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

Avatar Axel   
10. Juni 2007, 15:48

Na ob das was bringt? Wenn ich Content klaue bin ich immer als ‚Googlebot‘ unterwegs. 😉

Avatar Johannes   
10. Juni 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.

Avatar Pelle Boese   
10. Juni 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.

Avatar Axel   
11. Juni 2007, 08:57

Sorry – den DNS-Check habe ich gestern total übersehen. Ist so eine super Lösung.

Avatar Frank   
12. Juni 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   
12. Juni 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.

Avatar Johannes   
12. Juni 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: 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.

Avatar Sven   
12. Juni 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!

Avatar Sven   
12. Juni 2007, 16:43

So, bin jetzt mal wieder schlauer 😉

Avatar Makkus   
14. Juni 2007, 11:44

Hey Johannes.

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

Avatar Johannes   
14. Juni 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.

Avatar Gregor   
27. Januar 2008, 20:23

Ist der Code noch aktuell?

Kann ich das Ganze auch mit sitemap.gz realisieren?

Johannes   
27. Januar 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.

Avatar Gregor   
28. Januar 2008, 08:59

In wie fern muss ich die Header anpassen? Kannst Du mir ein Beispiel zeigen?

Die Kommentarfunktion wird 30 Tage nach der Veröffentlichung des Beitrags deaktiviert.