Wie kann ich verhindern, dass Ressourcen auf meiner Website über Hotlinks ("Bilddiebstahl" / "Bandbreitendiebstahl") verknüpft werden?

8

Ich versuche das "ultimative" Anti-Hot-Linking zu schreiben .htaccess ...

Sie können viele Beispiele / Tutorials / Generatoren im Internet finden, aber viele davon sind falsch oder unvollständig (oder sogar beides).

Dies sind die Funktionen, nach denen ich suche:

  • Muss die Hot-Verknüpfung für eine Liste von Dateierweiterungen blockieren, wenn HTTP_REFERER eine fremde Site ist.
  • Muss Hotlink für die aktuelle Domain (duh) zulassen, ohne sie im .htaccess zu harcodieren.
    • Für die aktuelle Domain muss es unter http und https funktionieren.
    • Für die aktuelle Domain muss es mit www und ohne www funktionieren.
  • Muss in der Lage sein, Ausnahmedomänen zu diesen Regeln hinzuzufügen (wie unser Freund Google) und diese Domänen müssen unter http und https und mit www oder ohne www funktionieren.

Folgendes habe ich bisher erreicht:

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

Meine Fragen:

  1. Wie vermeide ich es, mydomain.comim .htaccess fest zu codieren ? (Es wäre großartig, diesen .htaccess für alle meine Domänen bereitstellen zu können, ohne ihn für jede von ihnen ändern zu müssen.)
  2. In meiner RewriteRule, gif|jpe?g|png|zipx?entspricht nicht gif|jpg|jpeg|png|zip|zipxwahr? (Sorry noch neu bei regulären Ausdrücken.)
  3. Sehen Sie etwas Schlechtes in meinem .htaccess, von dem ich nichts weiß?

Für # 1 weiß ich, dass es etwas möglich ist. Das nächste, das ich gefunden habe, ist dieses Snippet, das das WWW aus der URL entfernt, ohne die Domain fest zu codieren. Gibt es eine Möglichkeit, diese Methode für meine Frage Nr. 1 zu verwenden?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

Aktualisieren:

Mir sind Lösungen bekannt, die ein Bild mit Wasserzeichen anstelle des normalen liefern. Aber ich suche nicht nach einer solchen Lösung. Ich möchte eine universelle Lösung (dienen 403 Fehler), die für alle Arten von Binärdateien (zip, exe, iso, jpg, png, gif ...) funktioniert.

AlexV
quelle
IMHO Apache sollte diese Konfigurationsdatei zumindest als Option enthalten. Ich frage mich, ob Apache-Entwickler bereit wären, es hinzuzufügen, wenn Sie / wir uns eines einfallen lassen könnten.
Chris Nava
5
Tu es nicht. Hier ist, warum - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Tom O'Connor
@ Tom O'Connor Interessante Lektüre und ich stimme dem zu. Aber mein Skript wird in meinem Fall für große Binärdateien (wie zip, exe ...) und nicht für Bilder und dergleichen verwendet. Also müsste ich noch eine Antwort bekommen. Ja, Bandbreite ist billig, aber ein 500-MB-Zip ist nicht dasselbe wie ein 100-KB-JPG ...
AlexV
Ich habe keine Antwort gefunden. Ich habe nur gebissen;)
Tom O'Connor

Antworten:

9

Unabhängig davon, was Sie tun, werden Sie CPU-Zyklen "verschwenden" (um festzustellen, ob die Referrer-Site (die die Verknüpfung ausführt) autorisiert ist oder nicht, müssen Sie die Anforderungsdaten verarbeiten).
Sie können nur Bandbreite sparen und gleichzeitig ein Minimum an CPU-Zyklen verschwenden .

Es gibt einige Beispiele in den Apache-Dokumenten , die genau das tun, was Sie wollen. Dieses:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

scheint am besten geeignet zu sein (und erfordert nicht das volle Gewicht von mod_rewrite).
Sie können zusätzliche gültige Verweise mit zusätzlichen SetEnvIfund AllowDirektiven hinzufügen .

voretaq7
quelle
Nicht schlecht, aber ich brauche eine Lösung, die den Domainnamen im htaccess nicht fest codiert (lies meine Frage sorgfältig durch).
AlexV
Dann brauchen Sie eine programmatische Lösung, wie sie Oliver vorgeschlagen hat (für die Sie immer noch eine Liste, einen regulären Ausdruck oder eine andere Darstellung der zulässigen Verweise fest
codieren müssen
Nicht unbedingt, wenn Sie sich meinen 2. Codeblock ansehen, können Sie sehen, dass dies möglich ist ... Ich muss es nur an meinen Fall anpassen ...
AlexV
Sie können die Bereinigungslogik in Ihrem zweiten Codeblock (oder eine ähnliche Magie nur %{HTTP_HOST}für weniger Regex-Analyse) verwenden, um den Host der URL in Ihren Regelsatz einzufügen, wodurch Sie dynamische lokale Domänen erhalten sollten (ausgiebig testen), aber Sie müssten immer noch hart arbeiten -code "nette" externe Referrer wie Google (nach Referrer, User Agent, IP usw.)
voretaq7
3

Wie wäre es, wenn Sie eine Regel schreiben, die, wenn der Referer unbekannt (verboten) ist, einfach eine PHP-Datei aufruft, in der Sie das Bild als Parameter übergeben, und in der PHP-Datei einfach rot einfügt: "Diese Datei stammt von MYWEBSITE.COM und hat keine offizielle Berechtigung, hier gezeigt zu werden ".

Machen Sie Ihre Regel für Ihre Frage global. Korrigieren Sie mich, wenn ich falsch liege , aber wenn die Regel vor einem vhost deklariert wird, wird sie auf alle vhost angewendet (eine Art "Standardregel").

Und eine andere Idee ist einfach: Leiten Sie einfach zu einer PHP-Datei (hier filter.php) um, die auf der autorisierten Website angezeigt wird, und geben Sie die erforderliche Datei zurück, wenn alles in Ordnung ist:

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

In filter.phpnur Last dynamisch eine Liste von vHost oder so ähnlich:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}
Olivier Pons
quelle
Es ist eine Möglichkeit, aber ich möchte keine CPU darüber "verschwenden" (mit PHP). Ich möchte nur 403er bedienen. Auch mit PHP müssen Sie alle Caching-Probleme verwalten und dies kann sehr komplex sein.
AlexV
1

Cloudflare kann Ihnen hilfreich sein: http://www.cloudflare.com

Dies funktioniert jedoch nur für Bilder, aber das scheint das zu sein, wonach Sie suchen.

Hotlink-Schutz

Aktivieren Sie automatisch den Hotlink-Schutz für Ihre Bilder, um eine externe Verknüpfung zu verhindern. Referenten, die sich nicht in der Zone befinden und nicht leer sind, wird der Zugriff verweigert. Unterstützte Dateierweiterungen sind gif, ico, jpg, jpeg und png.

Geschützt: http://mydomain.com/images/pic.jpg Umgehen: http://mydomain.com/images/hotlink-ok/pic.jpg

Pablo
quelle
0

Frage 1:

RewriteEngine On
RewriteCond% {HTTP_REFERER}! ^ Http : // (. +)? Yoursite.com/ [NC]
RewriteCond% {HTTP_REFERER}! ^ $
RewriteRule. *. (Jpe? G | gif | bmp | png) $ - [F]

Frage 2:

Ja

Frage 3

Ich würde meinen benutzen

Genesis
quelle
Bei Frage 1 ist "yoursite.com" fest codiert, daher ist es nicht hilfreich.
AlexV
@AlexV: Ist es nicht. Ersetzen Sie einfach yoursite.com durch Ihre Adresse, die Sie ERLAUBEN möchten, und andere Referenten können keine Bilder herunterladen
Genesis
Und wie erlaube ich mir, es nicht fest zu codieren?
AlexV