automatische webseitenkopie verhindernWeil ich häufig mal keinen Internetzugang habe, kopiere ich gerne ganze Webseiten auf meinen Laptop und durchstöbere die Inhalte später in ruhe. Während ich also meine Lieblingsseite kopiere komme ich auf den Gedanken, dass ich nicht unbedingt möchte, dass jemand meine ganzen Inhalte in einem Rutsch runterläd. Doch wie verhindert man das?

Warum stört es mich, wenn andere meine Webseite kopieren?

Ganz einfach: zum einen verhindert es korrekte Statistiken, weil für jeden Artikel ein angeblicher Besucher hinzukommt. Zum anderen belastet es meinen Server / Traffic, was zum einen Geld kostet und zum anderen die Ladezeiten der anderer echten Besucher verlängert. Der dritte Grund liegt im Contentdiebstahl, d.h. Diebe könnten versuchen die Inhalte meiner Seite zu extrahieren und zukünftig auf anderen Seiten als jeweils Eigene
auszugeben.

So werde ich das Problem lösen

Ich würde in einer Datenbank die IPs der Besucher zwischenspeichern und wenn eine IP mehr als XX Seiten pro Minute oder XX Seiten pro Tag runterläd wird der Zugriff mit einer Fehlermeldung verweigert.
Ich nehme die IP und nicht die Session oder irgendein anderen Cookie, weil Sessions (Cookies) einfach vom Nutzer / Kopierprogramm deaktiviert werden können. Natürlich ist es auch möglich, dass mehrere Menschen die selbe IP verwenden, allerdings ist die Wahrscheinlichkeit, dass sich 2 verschiedene Menschen zeitgleich (innerhalb der selben Minute) auf der selben Seite bewegen sehr gering. Selbst wenn dieser unwahrscheinliche Fall eintritt, so müssten die Beiden jeweils massiv viele Seiten anklicken um den Filter zu aktivieren.

Die Datenbank

Als Datenbank verwende ich eine einfache einspaltige Relation:

CREATE TABLE IF NOT EXISTS `sec_antikopie` (
`ip` INT NOT NULL ,
`zeit` INT UNSIGNED NOT NULL ,
INDEX ( `ip` )
) ENGINE = MYISAM ;

Die IPs speicher ich als INT, weil IPs auf diese Art besonders effektiv gespeichert und verarbeitet werden können. Hier finden Sie genauere Informationen um IP´s effizient zu speichern. Die Zeit speichere ich als Time-Stamp.

Das Script

Das folgende Script sollte möglichst weit oben im Quellcode eingebaut werden. Falls die Seite standardmäßig eine Verbindung zur Datenbank herstellt, so sollte das Script direkt nach der Datenbankverbindung eingefügt werden.

'.(time()-60).') as zahl_minute,(select count(*) FROM `sec_antikopie` WHERE ip='.ip2long($_SERVER['REMOTE_ADDR']).' and zeit>'.(time()-60*60*24).') as zahl_tag'));

if (($aufrufe['zahl_minute']>$max_erlaubte_aufrufe_minute) || ($aufrufe['zahl_tag']>$max_erlaubte_aufrufe_tag))
  {
  die('Sie haben zu viele Aufrufe auf diese Seite gemacht');
  }

mysql_query('insert low_priority into sec_antikopie(ip,zeit) values ('.ip2long($_SERVER['REMOTE_ADDR']).','.time().')');

if (rand(1,1000)==10) //Jeder tausendste
  {
  mysql_query('delete from sec_antikopie where zeit 

Das Script baut zuerst eine Verbindung zur Datenbank auf. Falls diese bereits durch die Seite besteht muss man natürlich keine zweite Verbindung aufbauen und kann die ersten 2 Zeilen löschen. Die nächsten zwei Zeilen enthalten die Einstellungen: ich lege fest, dass jede IP maximal 10 Aufrufe pro Minute und maximal 50 Aufrufe pro Tag.
Als nächstes wird aus der Datenbank die Anzahl der Seitenaufrufe der letzten Minute und die Anzahl der heutigen Seitenaufrufe ermittelt. Falls diese die Grenzwerte aus den Einstellungen überschreiten wird der weitere Seitenaufbau abgebrochen. Die nächste Zeile fügt eine neue Eintrag in die Datenbank ein mit IP und Uhrzeit ein. Das “low_priority” signalisiert dem Datenbanksystem, dass es sich um eine “unwichtige” Anfrage handelt, die dann ausgeführt werden soll, wenn das System gerade nichts zu tun hat. Sämtliche weitere Nachteile von low_priority (z.B. Datenverlust bei Serverzusammenbruch) haben keinen funktionalen Einfluss auf dieses Script und werden deshalb hier nicht weiter besprochen.
Der letzte Abschnitt wird durchschnittlich bei jedem tausendsten Besucher durchgeführt. Es werden alle veralteten Einträge aus der Datenbank gelöscht. Dieser Schritt verhindert, dass die Datenbank “Datenleichen” ansammelt und mit der Zeit vollläuft. Je nach Geschmack kann man das Löschen auch in einen Cronjob auslagern, wodurch man den “ungünstigen Zufall” (das das Script z.B. eine million mal nicht die Zufallszahl 10 wählt) verhindert.

Zusammenfassung

Sie sind jetzt in der Lage Ihre Webseite gegen automatisiertes Kopieren zu schützen. Sie wissen wie die Datenbank zu erstellen ist, wie der Code eingebaut werden muss und was er bewirkt. Das Script geht äußerst schonend mit den Serverressourcen um und kann deshalb auch auf stark frequentierten Seiten eingesetzt werden.