Månedlige arkiver: november 2010

Hvordan jeg stopper hotlinkere – og får gratis reklame for xmasb.com

En gang i blant sjekker jeg statistikk for bloggen. Etter som årene har gått (og hyppigheten på bloggingen har gått noe ned) har jeg sluttet å lese statistikk annen hver dag. Men det hender jeg sjekker litt, mest for å se etter endring i mønsteret, og hvilke poster og sider som mottar mest trafikk. En sjelden gang iblant går jeg litt dypere til verks og sjekker da hvilke ressurser på serveren som får mest trafikk, sånn som bilder.

Når jeg gjorde dette i går fant jeg ut, ikke overraskende, at det er mye trafikk fra diverse nettsider som henter bilder fra meg. Begrepet hotlinking har jeg vært innom før, for snart tre år siden satte jeg i gang tiltak. Men som så mye annet krever det en viss vedlikehold, så det var på tide å gjøre noen grep igjen. Etter tre år skulle det vise seg å være mange som stjeler båndbredde av meg.

Mens jeg tidligere har tatt i bruk et bilde som forteller at det er slemt å hotlinke syntes jeg dette var en gyllen mulighet for to ting: å spre reklame for bloggen min (selv om jeg har cirka null kontroll over hvor den blir vist), og en mulighet for å være litt morsom på andres bekostning. Sistnevnte fikk umiddelbart høyest prioritet av åpenbare grunner.

Her er et bilde jeg tidligere har brukt for de som hotlinker fra meg: Hotlink Text

Det har jo absolutt gjort nytten sin. De færreste ønsker å vise det fremfor det de egentlig ville ha, som kanskje var en søt valp eller et juletre. Så de bytter til noe annet, eller kopierer bildet fra meg. Å kopiere bilder fra bloggene til andre er et tema vi ikke trenger å gå inn på nå. Så lenge det ikke er bilder jeg selv har tatt/laget tar jeg det uansett ikke så tungt.

Fremgangsmåten for å hindre hotlinkere var omtrent som forrige gang, men med en liten tvist: nytt bilde og logging av misbrukere. Loggingen er ikke så viktig i seg selv, og jeg kommer nok til å endre litt hvordan den virker også, men det kan være grei info å ha når jeg vil vite omfanget av hotlinking.

Det morsomme er bildet. Nedenfor følger et par eksempler på bilder som ofte blir hotlinket til på xmasb.com:

Jeg kan godt forstå at disse bildene kan være attraktive å bruke. Men jeg synes da bildet jeg serverer i stedet er mye morsommere. Det ser slik ut:

Don't hotlink xmasb.com!

Nå vil det ikke spare noe særlig på båndbredden i seg selv ved å servere et annet bilde, men de fleste velger å ikke bruke dette bildet av en eller annen grunn… Jeg kunne servert for eksempel «403 Forbidden» til requestet, og dermed spart hele båndbredden, men det er jo ikke noe moro. Og det gir meg litt ekstra reklame også. I oktober hadde bloggen like over 10000 visninger av bilder fra xmasb.com på andre domener. De fleste av sidene viser nå forrige viste bilde, eller har byttet.

Så hvordan har jeg egentlig gjort dette? Det er ikke vanskelig. Akkurat som forrige gang endret jeg .htaccess filen for å få effekten jeg ville ha. I slutten av denne filen la jeg til følgende:

BEGIN Hotlink stopper

RewriteEngine on RewriteCond %{HTTP_REFERER} ^(.+.)?blogg.no/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?blogspot.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?clublife.no/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?livejournal.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?myspace.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?nettby.no/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?trykker.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^(.+.)?wordpress.com/ RewriteRule ^(.*).(gif|jpe?g|png)$ http://%{HTTP_HOST}/hotlink/hotlink.php?url=$1.$2 [R,NC,L]

END Hotlink stopper

For bedre lesbarhet har jeg fjernet de fleste fra listen. Kort fortalt gjør denne lille snutten at alle forsøk på å vise bilder fra oppgitte domener/sider fører til et kall av hotlink.php, som igjen serverer dama over og logger requestet. Jeg logger da url for siden som kaller, IP for besøkende av siden, tidspunkt og hvilket bilde som er forsøkt hotlinket. Mest sannsynlig kommer jeg også til å endre oppsettet senere til også å logge de som får lov til å vise bilder, for å kunne få en oversikt over disse og eventuelt lett blokkere flere.

Dersom logging ikke trengs eller er ønskelig kan det lett byttes ut med et bilde istedet for php script, men da er det viktig å legge til en linje som tillater bruk av det ene bildet hos de som egentlig ikke skal kunne se bilder fra bloggen. Følgende linje kan da legges inn rett før Rewriterule:

RewriteCond %{REQUEST_URI} !http://%{HTTP_HOST}/wp-content/uploads/hotlink.jpg

Denne tillater visning av bildet hotlink.jpg. Husk også å legge til en OR for siste i listen før denne.

Tidligere har jeg forsøkt å stoppe alle requests bortsett fra et knippe jeg tillatter, men dette har ikke fungert så godt som håpet. Problemet er blant annet lesere av feeden. Det er ikke noe problem å tillate Google, men hva med alle andre? Hvor mange og hvilke er det? Jeg har ihvertfall ikke en god oversikt. Tidligere forsøkt på dette har bare ført til frustrasjon da bilder i feeden hos for eksempel en som bruker Outlook som leser er vanskelig å ta høyde for. Stikkordet med løsningen jeg har valgt må være «godt nok». Det krever en viss vedlikehold, men ikke verre enn at jeg går inn i loggen en gang iblant og luker ut de verste.

Som oftest er det ikke de bloggene som har to besøkende om dagen som er problemet, men forum og andre sider med høy aktivitet. I mitt tilfelle har jeg nok av båndbredde foreløpig, så da kan jeg godt servere et annet bilde istedet. Men jeg har sørget for at bildet er komprimert så mye som mulig likevel. Dersom du har tenkt å bruke tekst kan det være verdt å sjekke forskjellen i størrelse mellom flere formater (gif/jpg først og fremst).

Et siste tips. Når du tester om dette virker, typisk ved å se om bildet vises eller ikke på den siden som har hotlinket, vil gjerne nettleseren bruke det bildet du allerede har i cahe. De fleste nettlesere kan tvinges til å hente på ny ved å trykke ctrl-F5 eller tilsvarende.

Oppdatering: Jeg har gjort dette mye smidigere ved hjelp av litt enkel koding.