Automatisches Webseitenkopieren verhindern
Martin Kiesewetter
Weil 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 `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.
<?php mysql_connect('xxx','xxx',''); //Datenbankverbindung mysql_select_db('xxx'); //Settings Start $max_erlaubte_aufrufe_minute=10; $max_erlaubte_aufrufe_tag=50; //Settings Ende $aufrufe=mysql_fetch_assoc(mysql_query('SELECT (select count(*) FROM `sec_antikopie` WHERE ip='.ip2long($_SERVER['REMOTE_ADDR']).' and zeit>'.(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 <'.(time()-24*60*60)); } ?>
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.
16 Kommentare
Kommentar von Oliver Tasche am 15. November 2010 um 22:23
Zitat “Zum anderen belastet es meinen Server / Traffic, was zum einen Geld kostet und zum anderen die Ladezeiten der anderer echten Besucher verlängert.”
Nun ja, wenn du dir bei deinem Hoster um so etwas Sorgen machen musst, solltest du dringend mal wechseln
Zitat “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.”
Wie bitte? Oft passiert es, das ich oder meine Arbeitskollegen dem gesamten Team ein und den selben Link zuschicken (via Instant Messenger). Binnen einer Minute wird ein und die selber URL von der selben IP (Firmennetzwerk, surfen über Proxy – völlig normal) mehrfach aufgerufen!
Zitat “Hier finden Sie genauere Informationen um IP´s effizient zu speichern.”
Wo? Wo? Woho? Da ist nichts verlinkt!
Zitat “Das Script geht äußerst schonend mit den Serverresourcen um und kann deshalb auch auf stark frequentierten Seiten eingesetzt werden.”
Gerade hier würde ich erwähnen, das jeder “tausendste” Besucher erst nach wenigen Tagen oder binnen einer Minute (gerade bei SEHR stark frequentierten Seiten steigt die Wahrscheinlichkeit enorm!) auftauchen kann.
Kommentar von Karsten am 16. November 2010 um 06:44
Du sperrst auch die Crawler von Suchmaschinen aus, oder? Das willst Du?
BTW: In unserem Unternehmen surfen 3000 Mitarbeiter über einen Proxy und somit einer IP…
Kommentar von Martin am 16. November 2010 um 07:48
Löschen macht man in einem Shut-Down Hook.
Traffic und Geld (da schliesse ich mich Oliver an) ist kein Argument, ansonsten sollte man keine Webseite veröffentlichen.
Und der Google Bot und andere “legale” Crawler die man auf der Seite haben will, die werden daas auch nicht lustig finden, wenn sie plötzlich ausgesperrt werden. Schonmal kontrolliert, wie viele Seiten z.B. der Yahoo Bot nacheinender lädt?
Kommentar von ovnn am 16. November 2010 um 08:24
Das Hauptproblem sehe ich hierbei im aussperren der Suchmaschinen wie Google yahoo etc pp.
So schön die Idee auch ist aber sie funktioniert so nicht wirklich gut.
Kommentar von RennerChristian am 16. November 2010 um 09:10
Ich finde die Idee im Ansatz falsch.
Du selbst leitest den Artikel ein, indem du den Use-Case “read later” beschreibst. Ich denke, dass dieser vor allem im Mobil-Bereich (siehe z.B. InstantPaper) recht weit verbreitet ist und dank der mangelnden Verfügbarkeit von mobilem Internet in der Fläche Deutschlands auch auf Jahre sein wird.
Wahrscheinlich gibt es auch noch zig weitere (browsershots, google-vorschau, ….).
Die einzelnen Punkte deiner dreiteiligen Begründung (Statistik – Traffic – Copyright) finde ich zwar inhaltlich richtig, jedoch zählen Sie für mich zu den ganz normalen “Gefahren”, die durch die Veröffentlichung von Inhalten im Internet auf einen lauern.
Jeder Abruf einer Ressource sollte als solcher gezählt werden, weil es nicht mehr und nicht weniger ist. Wichtiger ist die Kategorisierung und Gewichtung des einzelnen Abrufs mit Hilfe des Kontextes. Ein “Verfälschen” sehe ich da beim besten Willen nicht. Der Abruf ist nicht “angeblich”. Sondern ihn gibt es oder eben nicht.
Traffic gibt es nunmal. Sobald man Probleme bekommt, muss man eben optimieren oder aufrüsten. Die Lösung kann jedoch imo nicht sein, potentielle Lesergruppen auszuschließen. Wo besteht denn dann bitte der Sinn in der VerÖFFENTLICHung ?!
Contentdiebstahl öffentlich zugänglicher Inhalte lässt sich in meinen Augen nicht verhindern. Schon gar nicht auf Basis der IP-Adresse. Die IP-Adresse ist heutzutage, wie auch schon mein Vorredner anklingen lies, eigentlich gar nichts wert. Die Nutzer verwenden immer häufiger Proxies und VPN-Zugänge, wodurch die Anzahl der selben IPs je Zeitraum automatisch steigt. Andere und vor allem eindeutige Erkennungmaßnahmen existieren ohne Authentifizierungsmaßnahmen imo nicht. Im Gegenteil: Der “Inhaltsklau” wird meistens von Personen vorgenommen, die es genau verstehen, die “Abwehrmechanismen” zu umgehen.
Über die konkrete Umsetzung braucht man dann unter oben genannter Punkte nicht nachzudenken.
Eventuell habe ich es auch nicht verstanden, aber was ist denn nun genau das Ziel des Artikels?
Kommentar von Martin Kiesewetter am 16. November 2010 um 11:38
Erstmal danke für sooooo viele Kommentare. Ich versuche mal auf die Hauptkritikpunkte einzugehen:
IP ist nichts Wert
============
ich habe im PHP schript ja explizit die Grenzwerte für Zugriffszahlen angebenen. Wer in einem großen Unternehmen arbeitet, sollte diese anpassen und ggf. die eigene proxy-IP komplett ausschließen.
Wozu veröffentlichen, wenn den Zugriff unterbindet?
====================================
Ich blogge aus Spaß. Es soll aber massiv menschen geben, die Bloggen um sich ein kompetentes Image zuzulegen und damit Neukunden generieren. Diese finden es sicher nicht toll, wenn irgendwo Kopien ihrer Seite auftauchen.
Wenn Server/traffic ein Problem ist => aufrüsten!
===================================
Logisch! so würde ich auch vorgehen, wenn mein Goldesel im Keller nicht weggelaufen wäre. Ne im ernst: die meisten von euch arbeiten offensichtlich in größeren Firmen. Ich habe auch eine zeitlang in einer großen Firma (rund 5.000 Mitarbeiter) gearbeitet und da war die Orgenisation von 2-3 extra Servern auch kein Problem. Aber die meisten Webmaster leiden immer unter finanziellen Problemen und da ist aufrüsten erst die zweite wahl nach software-optimieren. Falls jemand von euch einen Server übrig hat – gerne
@Martin: hast du zahlen wieviele Seiten Suchmaschinen pro Tag bei dir / generell so crawlen? Also hier im Blog sind es auf die Minute gerechnet einer (es werden pro Stunde max. 2-3 Seiten gecrawlt). Auf großen Seiten sieht die Sache ggf. anders aus.
Während der Abschlussarbeit meines Studiums (Thema: Suchmaschinenoptimierung) habe ich in etlichen Büchern gefunden, dass Suchmaschinen die Anzahl der zu Crawlenden Seiten stark nach der Häufigkeit der Contentwechsel / Bedeutung der Seite im Weg regeln.
@Cristian: “Jeder Abruf einer Ressource sollte als solcher gezählt werden, weil es nicht mehr und nicht weniger is”
Das sehe ich vollkommen anders: Wenn 2 Unterseiten beispielsweise (extremfall) einmal 1000 und einmal 1005 Aufrufe hat würde man glauben, dass beide Themen ungefähr gleich viele Leute interessieren. In wirklichkeit wurde die Seite aber 1000mal komplett runtergeladen und die Seite mit den 1000 Zugriffen interessiert absolut niemanden.
D.h. die Statistik wären wirklich komplett falsch.
P.S. der fehlende Link wurde nachgearbeitet
P.S. falls ich jemanden Vergesen habe: einfach melden
P.S. danke für die Mail: ich werde mir rechtschreibmäßig mehr Mühe geben
Kommentar von Oliver Tasche am 16. November 2010 um 18:07
Zu der Sache mit den großen Firmennetzwerken:
Ich glaube die Meisten meinten, das viele Leute in “fremden” Firmen große Netzwerke mit Proxies einsetzen. Sprich, du verfasst einen Artikel, der in der Web-Agentur Meier super ankommt, schnell verbreitet wird und innerhalb von einer Minute von 20 Leuten angeklickt wird. Hierdurch kann es passieren, das einige der 20 Leute ausgesperrt werden.
Zum Thema aufrüsten:
Definitiv sollte man nicht nur mit Hardware aufrüsten sondern auch stets die Software aktuell halten und verbessern, wo es etwas zu verbessen gibt, ABER heutzutage kriegt man bereits für 10€ im Monat gute Webhosting-Pakete mit unbegrenzt Traffic auf schnellen Servern mit guter Internetanbindung. Und wer wirklich unbedingt eine eigene Internetseite mit eigner Domain, etc. haben will, sollte auch bereit sein mindestens diese paar Euro dafür auszugeben.
Kommentar von RennerChristian am 19. November 2010 um 18:35
Ich habe immer noch nicht verstanden, worin für dich der Unterschied zwischen einer “heruntergeladenen” (wenn ich es richtig verstanden habe, verstehst du darunter einen Klick auf “Speichern unter”) und einer “abgerufenen” Seite liegt.
Abruf ist Abruf. In meinen Augen lässt sich dieser Unterschied mit legalen Mitteln nicht einmal feststellen.
Da dies auch an meine zuvor gestellte Frage anknüpft, stelle ich diese einfach noch einmal: Könntest du mir eventuell noch einmal den Sinn deines Artikels erklären? Gerne auch per E-Mail, falls es sonst keinen interessieren sollte.
Kommentar von amsel am 20. November 2010 um 08:27
Schließe mich mal den Vorrednern an, das Vorgehen halte ich auch für einen privaten Blob völlig überzogen. Gegen das extrahieren von Content hilft das sowieso nicht.
Ich seh da auch noch ein rechtliches Problem:
Mit welchem Recht speicherst du jede IP-Adresse? Und wie lang genau kannst du auch nicht sagen/garantieren, wird ja “im Durchschnitt” nur bei jedem tausendsten Aufruf alles gelöscht was älter als 24h ist. Datenschutzerklärung irgendwo? Alles nicht so einfach. Das kann auch ganz schnell teurer werden also so ein lächerliches Hostingpaket kostet.
Kommentar von Sebastian am 26. November 2010 um 15:39
Das mit dem Content-Klau verstehe ich ja mal gar net… Ich meine du weißt schon, dass du einen Feed anbietest? Wenn ich deine Seite klauen will, dann lad ich mir den Feed, mach ein DOM Objekt drauf und schon kann ich das in meinem Template in mein eigenes Gewand Hüllen und deine Seite ist verdoppelt. Wenn du willst sag mir Bescheid, dann setzt ich mich morgen hin und deine Seite hat bald nen Bruder
Kommentar von Martin Kiesewetter am 28. November 2010 um 22:30
sicher, aber der hat nur eine sehr begrenzte Anzahl an Artikeln…um zu verhindern, dass jemand die ganze Seite auf einmal runterläd…
Kommentar von Freudi am 31. Dezember 2010 um 10:42
Martin, hast Du das von Dir skizierte Verfahren auf Deiner Site eingesetzt? Falls ja: es scheint nicht zu funktionieren. Weshalb?
Kommentar von Martin Kiesewetter am 31. Dezember 2010 um 13:31
Hallo Ottmar,
nein hab ich nicht eingesetzt, weil ich aktuell keine Probleme mit automatischen Webseitenkopierern habe und deshalb die Zeit sinnvoller einsetzte.
Viele Grüße
Martin
P.S. hast du ein Thema, was dich in der Zukunft interessieren würde (über das ich schreiben kann)?
Kommentar von Freudi am 1. Januar 2011 um 01:22
Gutes Neues!
Tja, ich bzw. einer meiner kleinen Sites leidet leider (seit der Ankündigung der Schließung der Site zu einem bestimmten Zeitpunkt – wobei es mittlerweile doch vorläufig weitergeht) unter solchen Kopierhanseln. Ich habe es daher mit Deiner Lösung versucht. Die Datenbank füllte sich wie erwartet – allein, das “Blockieren” derjenigen blieb weitgehend aus. Weitgehend deshalb, da vereinzelt tatsächlich der Zugriff blockiert wurde – aber unter der selben IP-Adresse konnte anschließend (eine Sekunde später) wieder/weiter “kopiert” werden :-/
Eine Idee, woran es liegen könnte?
Bye,
”di
Freu”Was mich in der Zukunft interessieren könnte, weiß ich heute nicht
Kommentar von Martin Kiesewetter am 1. Januar 2011 um 08:55
Frohes Neues!,
du weißt: Ferndiagnosen sind etwas schwierig – spontan hab ich keine Idee. Kannst mit ja mal deine Seite geben (falls geheim: per mail. Du schreibst leider so viel, dass ich keine nerven hatte bei jeder Seite Seite ins Impressum zu gucken, ob das deine Seite is).
Dann seh ich mal nach, wie weit ich beim kopieren komme
Viele Grüße
Martin
P.S. kannst mich auch anskypen: gregor5478
Kommentar von Freudi am 3. Januar 2011 um 06:19
Hi Martin,
nachdem die skizzierte Lösung offensichtllich auf meiner kleinen Site nicht funkioniert, habe ich sie wieder heraus genommen – ein wenig Performance kostet sie ja schon.
In http://board.s9y.org/viewtopic.php?f=10&t=17245 findest Du ein paar weitere Hinweise, auch dazu, was ich erreichen will. Im Schnitt gibt es pro Stunde um die 1.500 Zugriffe auf die kleine Site, was sich “Dank” Kopierhanseln locker verzehnfachen kann
Bye,
Freudi