Con il termine Hotlinking (o Inline linkingW) si indica una deprecabile pratica che consiste nell'inserire all'interno di una pagina web un collegamento ad una risorsa (molto spesso un immagine) contenuta su un host remoto differente dal proprio.
L'operazione, in se apparentemente innocua, in realtà crea tutta una serie di problemi al sito (o server) ospitante la risorsa oggetto del collegamento esterno, primo fra tutti l'occupazione di banda (Bandwith theft) che, in taluni casi, può anche arrivare a causare dei seri rallentamenti a discapito del primo.
Infatti, il più delle volte, la tecnica di Hotlinking viene utlizzata da siti con elevato traffico nel caso in cui debbano publicare delle risorse dimensionalmente elevate (ad esempio foto in alta risoluzione) prese da fonti esterne anche a libera distribuzione. In tal modo si scarica sull'host remoto il carico di banda necessario per la visualizzazione delle stesse.
Come capire se il proprio sito è oggetto di Hotlinking
La strategia migliore è, come sempre, quella di osservare la sezione referrer degli accessi al proprio sito: se si nota un incremento inconsueto delle visite o degli hits, accompagnato da un rallentamento nel caricamento delle pagine, è opportuno fare un'indagine più approfondita. Generalmente le risorse caricate tramite collegamenti esterni lasciano tracce in quasi tutti i sistemi di web analytics, consentendo una rapida individuazione del referente incriminato.
Questo blog, ad esempio, è stato recentemente oggetto di Hotlinking su un immagine in esso contenuta da parte di un sito spagnolo che è riuscito a collezionare più di 1000 hits della stessa in 3 giorni. L'analisi dei referrer, mi ha consentito, anche se un pò in ritardo di individuare l'origine del traffico anomalo: purtroppo non sempre è possibile, ma sarebbe buona norma controllare le statistiche di accesso almeno una volta al giorno, per evitare problematiche di questo tipo. A titolo di cronaca, i sistemi di tracciamento basati su javascriptW, come ad esempio Google Analytics o LLOOGG, non consentono di individuare questa specifica anomalia: sono necessari strumenti in grado di analizzare i file di log del webserver su cui ci si appoggia per la pubblicazione del sito.
Quali contromisure applicare
La pratica del'hotlinking è diffusa da più di un decennio: molti hosting sono già dotati di sistemi di prevenzione del furto di banda ed impediscono a priori ad indirizzi esterni di collegarsi a risorse ospitate su di essi.
Alcuni, molto simpaticamente, una volta che si accorgono di essere oggetto del "furto", semplicemente si limitano a rimuovere o sostituire l'immagine "rubata" con un altra contenente appunto dei riferimenti espliciti al reato commesso. In talune occasioni (emblematico il recente caso relativo al blog di un noto politico nostrano) il proprietario dell'immagine linkata la sostituisce, per ritorsione, con un fakeW, con conseguenze facilmente immaginabili.
Dato che è meglio prevenire che curare, sarebbe auspicabile dotare il proprio sito di un meccanismo di protezione che impedisca i collegamenti esterni alle proprie risorse.
La soluzione per BlogEngine.NET
BlogEngine.NET gestisce la pubblicazione delle immagini tramite un httphandler. Questo ha semplificato in maniera incredibile la realizzazione di un'estensione che mi permettesse di proteggere la pubblicazione delle immagini da fonti esterne.
Dopo avere scritto le pochissime righe di codice necessarie alla realizzazione del plug-in, ho scoperto che Mads Kristensen aveva già realizzato un oggetto identico (sono solo 6 righe di codice c#) funzionante, però, solo con la release 1.2 di BlogEngine.NET. La mia versione, al contrario, sfrutta i nuovi eventi disponibili nella release 1.3 ed è quindi compatibile con quest'ultima (e anche la prossima a venire).
Poichè il codice è molto simile (una funzione è sostanzialmente uguale), ho deciso di inserire nei credits del mio plugin anche Mads, soprattutto perchè cronologicamente lui ha realizzato l'oggetto molto prima di me e, in ogni caso, non vorrei essere accusato di plagio.
In sintesi l'estensione non consente l'accesso alle immagini da parte di altri host al di fuori del proprio sito, restituendo un HTTP Error 403 (file not found) alle richieste esterne. Il tutto è stato realizzato abbastanza rapidamente (per tamponare l'emergenza occorsami) e sarà, in futuro oggetto di ulteriori modifiche (come ad esempio prevedere un'immagine sostitutiva contenente un messaggio di avviso, in alternativa alla generazione dell'errore).
Per il momento, è possibile scaricarne la prima versione, la cui installazione è semplicissima.
Una volta scaricato e decompresso il file:
HotlinkingImgBlock.zip (0,93 kb)
è sufficiente copiare HotlinkingImgBlock.cs nella cartella /App_Code/Extensions/ per attivare la protezione.
La soluzione per WordPress
Spulciando la rete ho trovato plugin per WordPress che dovrebbe far sostituire le immagini sottoposte ad hotlinking con un'immagine recante un messaggio di warning (o di divieto) scelta a piacere dall'utente. L'autore assicura la compatibilità con Wordpress fino alla versione 2.1.3: non ho approfondito ulteriormente sugli eventuali sviluppi del plugin in questione e nè ho verificato l'esistenza di altri prodotti analoghi.
Personalmente, trovo la soluzione della sostituzione dell'immagine poco opportuna, soprattutto perchè, anche se in minima parte, richiede sempre un minimo di banda da impegnare per l'invio della stessa.
Meglio quindi applicare una soluzione come quella praticata per BlogEngine.NET, ovvero rispondere alla richiesta dell'immagine tramite un HTTP ERROR 403.
La cosa è fattibile con estrema semplicità inserendo poche regole all'interno del file di configurazione .htaccess del proprio blog. Naturalmente questa soluzione è applicabile solo nel caso in cui si utilizzi Apache come web server di appoggio.
Posto quindi nomedelsito.com l'indirizzo del proprio sito web, inserire all'interno di .htaccess, le seguenti righe:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?nomedelsito\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F,L]
Il caso esaminato non consente l'accesso ai file con le estensioni indicate, ma può essere esteso anche ad altre semplicemente modificando la quarta riga. Analogamente (nella stessa riga) è possibile indicare un immagine sostitutiva da restituire al posto di quella richiesta (ma io mi sento di sconsigliare questa strategia per quanto già detto prima).