Come impedire il collegamento a caldo ("furto di immagini" / "furto di larghezza di banda") delle risorse sul mio sito?


8

Sto cercando di scrivere il .htaccess anti-hot link "definitivo" ...

Puoi trovare molti esempi / tutorial / generatori in rete, ma molti di essi sono errati o incompleti (o addirittura entrambi).

Queste sono le caratteristiche che sto cercando:

  • È necessario bloccare il collegamento a caldo per un elenco di estensioni di file quando HTTP_REFERER è un sito esterno.
  • Deve consentire il collegamento a caldo per il dominio corrente (duh) senza codificarlo in .htaccess.
    • Per il dominio corrente deve funzionare con http e https.
    • Per il dominio corrente deve funzionare con www e senza www.
  • Deve essere in grado di aggiungere domini di eccezioni a queste regole (come il nostro amico Google) e questi domini devono funzionare in http e https e con www o senza www.

Questo è quello che ho raggiunto finora:

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

Le mie domande:

  1. Come evitare di hardcode mydomain.comin .htaccess? (Sarebbe bello poter distribuire questo .htaccess a tutti i miei domini senza doverlo modificare per ognuno di essi.)
  2. Nel mio RewriteRule, gif|jpe?g|png|zipx?è equivalente a gif|jpg|jpeg|png|zip|zipxgiusto? (Mi dispiace ancora nuovo per le espressioni regolari.)
  3. Vedi qualcosa di brutto nel mio .htaccess di cui non sono a conoscenza?

Per il n. 1 so che è un po 'possibile. Il più vicino che ho trovato è questo frammento che rimuove il www dall'URL senza codificare il dominio. C'è un modo per utilizzare questo metodo per la mia domanda n. 1?

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

Aggiornare:

Sono a conoscenza di soluzioni che serviranno un'immagine con filigrana anziché quella normale. Ma non sto cercando questo tipo di soluzione. Voglio una soluzione universale (servire 403 errori) che funzionerà con tutti i tipi di file binari (zip, exe, iso, jpg, png, gif ...).


IMHO Apache dovrebbe includere questo file di configurazione almeno come opzione da includere. Mi chiedo se alcuni sviluppatori Apache sarebbero disposti ad aggiungerlo se potessimo inventarne uno?
Chris Nava,


@ Tom O'Connor Lettura interessante e sono d'accordo. Ma il mio script nel mio caso verrà utilizzato per file binari di grandi dimensioni (come zip, exe ...) e non immagini e simili. Quindi avrei ancora bisogno di una risposta. Sì, la larghezza di banda è economica, ma uno zip da 500 MB non è lo stesso di un jpg da 100 KB ...
AlexV

Non stavo cercando una risposta. Stavo solo lamentando;)
Tom O'Connor il

Risposte:


9

Indipendentemente da ciò che fai, "sprecherai" i cicli della CPU (per determinare se il sito del referrer (quello che sta effettuando il collegamento) è autorizzato o meno, devi fare qualche elaborazione dei dati della richiesta).
L'unica cosa che puoi fare è risparmiare larghezza di banda sprecando un minimo di cicli della CPU.

Ci sono alcuni esempi in Apache Docs che fanno esattamente quello che vuoi. Questo:

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

sembra essere il più applicabile (e non richiede l'intero peso di mod_rewrite).
È possibile aggiungere ulteriori referrer validi con ulteriori SetEnvIfe Allowdirettive.


Non male, ma ho bisogno di una soluzione che non codifichi il nome di dominio in htaccess (leggi attentamente la mia domanda).
AlexV

Quindi hai bisogno di una soluzione programmatica come quella proposta da Oliver (che richiede ancora di codificare un elenco, un'espressione regolare o qualche altra rappresentazione dei referrer consentiti - Ti consente solo di inserirlo in un file discreto)
voretaq7

Non necessariamente se guardi il mio secondo blocco di codice puoi vedere che può essere fatto ... Devo solo adattarlo al mio caso ...
AlexV

Puoi usare la logica di pulizia nel tuo secondo blocco di codice (o magia simile solo %{HTTP_HOST}per meno analisi regex) per inserire l'host dell'URL nel tuo set di regole, che dovrebbe comprarti domini locali dinamici (test ampiamente), ma dovresti comunque fare duro con codice "simpatici" referrer esterni come Google (per referrer, user agent, IP, ecc.)
voretaq7

3

Che ne dite di scrivere una regola che, se il referer è sconosciuto (di proibito), basta chiamare un file Php in cui si passa l'immagine come parametro, e nel file Php, basta mettere in grande rosso: "questo file proviene da MYWEBSITE.COM e non ha l'autorizzazione ufficiale per essere mostrato qui ".

Per quanto riguarda la tua domanda, rendi la tua regola globale. Correggimi se sbaglio, ma se la regola viene dichiarata prima di qualsiasi vhost, verrà applicata su tutto il vhost (tipo di "regola predefinita").

E un'altra idea è semplice: basta reindirizzare a un file Php (qui filter.php) che cercherà nel sito Web autorizzato e restituirà il file richiesto se tutto è ok:

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

Nel filter.phpsolo caricare dinamicamente un elenco di vhost o qualcosa del genere:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}

È una possibilità, ma non voglio "sprecare" la CPU su questo (usando PHP). Voglio solo servire i 403. Anche con PHP, devi gestire tutti i problemi di memorizzazione nella cache e questo può essere abbastanza complesso.
AlexV,

1

Cloudflare può esserti di aiuto: http://www.cloudflare.com

Questo tuttavia funziona solo per le immagini ma sembra essere quello che cerchi.

Protezione hotlink

Abilita automaticamente la protezione hotlink per le tue immagini per evitare collegamenti fuori sede. Ai referenti che non sono nella zona e non sono vuoti verrà negato l'accesso. Le estensioni di file supportate sono gif, ico, jpg, jpeg e png.

Protetto: http://mydomain.com/images/pic.jpg Per ignorare: http://mydomain.com/images/hotlink-ok/pic.jpg


0

domanda 1:

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

Domanda 2:

Domanda 3

Vorrei usare il mio


Per la domanda 1, "yoursite.com" è hardcoded, quindi non è utile.
AlexV,

@AlexV: Non lo è. Sostituisci semplicemente yourite.com con il tuo indirizzo che vuoi CONSENTI e altri referenti non riusciranno a scaricare alcuna immagine
genesi

E come mi permetto senza codificarlo?
AlexV,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.