«

»

Stogg hotlenking med .htaccess, PHP og vassmerking

Merknad: Dette innlegget er fleire år gammalt. Informasjonen kan vere utdatert og eg kan ha endra syn sidan då.

Nyleg oppdaga eg at vitjingstatistikken på bloggen ikkje stemte med bandbreidda som brukast her. Nyfiken gløtta eg litt nærmare vitjingsloggen. Eg såg då at det er personar som har hotlenkja bilete som ligg her. Dersom du ikkje veit kva dette tyder, vil det meste av dette innlegget vera uforståeleg for deg. Hotlenking er når du bruker eit bilete direkte frå ein annan nettstad. God kotyme er å anten sjekka om det er greitt å hotlenkja, eller kopiera biletfila over til eigen nettstad. For når du hotlenkjar, bruker du jo av bandbreidda til den andre nettstaden. Er dette gjort utan løyve, så er det nærmast tjuveri.

For meg er det førebels ikkje eit kjempestort problem. Det er ikkje snakk om mykje illegal trafikk, men det nok til at eg merker det. Eg funderte litt på kva eg skulle gjera:

1) Tillata det

Framgangsmåten for dette er enkelt. Eg treng ikkje gjera noko. Biletet ser slik ut, same om du ser det på denne nettstaden eller om det er hotlenkja frå ein annan stad:

2) Vassmerke

Eg tykkjer dette er den mest elegante måten. Rett nok vil ikkje dette stogga steling av bandbreidde, men det vil gje deg gratisreklame, og etterkvart fungera demotiverande på tjuven, som plutseleg ser at er kome eit vassmerke på biletet. Du kan leggja ein logo eller tekst oppå alle bileta dine, til dømes «Frå nettstadendin.no». Logoen/teksten bør vera liten og stutt, sidan det skal få plass på alle bileta dine.

«Uff, eg gidder ikkje å redigera alle bileta eg allereie har lagt ut!»

Det er difor dette er ein elegant måte – du slepp nemleg å redigera bileta dine! Du fikser nemleg dette med .htaccess 1 og PHP 2.

Du treng tre filer: hotlinkvassmerke.png, hotlink.php og .htaccess. Den siste eksisterer truleg frå før, og då må du ikkje overskriva den. Gjer endringane dine i slutten av den.

Vassmerket ser kanskje slik ut:

Bruk PNG med gjennomsikt for best effekt. Merk at vassmerket mitt er 215 pikslar brei, så dette vil berre fungera på bilete minst like brei. Har du bilete som er smalare enn dette, lyt du kanskje vurdera å laga eit smalare vassmerke. Bruker du tekst, pass på å bruka kontrastfargar (her svart tekst med kvit omkrins) slik at teksten synast same kva farge originalbiletet har.

Vassmerket leggjast til biletet med PHP. Opprett hotlink.php, og skriv inn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
$fil = strip_tags( $_GET['fil'] );
// Skriptet skal alltid ha variabelen $fil.
// Skriptet skal alltid visa til ei eksisterande fil.
if ( ! $fil || !file_exists($fil) ) {
	die("Error: Image not found"); // stogg skriptet viss feil vilkår
}
 
// hent inn vassmerket
$vassmerket = imagecreatefrompng('hotlinkvassmerke.png');
 
// finn filtype (jpg, png, gif) og hent inn biletet
$filinfo = pathinfo($fil);
if($filinfo['extension']=="png"){
	$biletet = imagecreatefrompng($fil);
}elseif($filinfo['extension']=="gif"){
	$biletet = imagecreatefromgif($fil);
}elseif($filinfo['extension']=="jpg" || $filinfo['extension']=="jpeg"){
	$biletet = imagecreatefromjpeg($fil);
}else{
	die("Error: Not an image"); // stogg skriptet viss feil filtype
}
 
// finn ut storleikene og definer kvar vassmerket skal stå
$vassx = imagesx($vassmerket);
$vassy = imagesy($vassmerket);
$startx = imagesx($biletet) - $vassx - 5; // høgrejuster med 5 px marg
$starty = imagesy($biletet) - $vassy - 5; // still nederst med 5px marg
 
// Plasser vassmerket på biletet
imagecopy($biletet, $vassmerket, $startx, $starty, 0, 0, $vassx, $vassy);
 
// Send til nettlesaren og avslutt
header('Content-type: image/png');
imagepng($biletet);
imagedestroy($biletet);
?>

Vassmerket vil no stå nederst til høgre. Viss du vil midtstilla vassmerket for å gjera det endå mindre attraktivt å hotlenkja, kan du byta endra linene:

27
28
$startx = ((imagesx($biletet) - $vassx)/2); // midtstill horisontalt
$starty = ((imagesy($biletet) - $vassy)/2); // midtstill vertikalt

Til slutt skal .htaccess filtrera all trafikk til biletfiler som ikkje kjem frå eigen nettstad, gjennom php-skriptet. Me lagar unntak for underdomene, slik at nettstadenmin.no og www.nettstadenmin.no kan bruka bileta utan vassmerke. Me lagar også unntak for søkjemotorar som Google, for ikkje å mista treff derifrå. Legg dei følgjande reglane etter eventuelt eksisterande innhald i .htaccess-fila di:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# BEGIN Stogg hotlenking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?nettstadendin\.no.*$ [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{REQUEST_URI} !^/hotlink\.php*$
RewriteRule (.*) hotlink.php?fil=$1
</IfModule>
# END Stogg hotlenking

På nettstaden ser biletet heilt normalt ut, men dersom det er hotlenkja, vil det sjå slik ut:

3) Servera eit standardbilete

I staden for å leggja eit vassmerke over alle bileta, kan me servera eit standardbilete. Då treng me berre to filer: hotlink.jpg og .htaccess.

Det er stort sett det same som står i .htaccess-fila, berre line 11 og 12 er endra:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# BEGIN Stogg hotlenking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?nettstadendin\.no.*$ [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{REQUEST_URI} !^/hotlink\.jpg*$
RewriteRule (.*) hotlink.jpg
</IfModule>
# END Stogg hotlenking

Kva slags bilete skal me servera? Noko skikkeleg flaut/ekkelt? Ei streng melding om at hotlenking er tjuveri? Køyra passiv-aggressiv stil? Dette er opp til deg.

På nettstaden ser biletet heilt normalt ut, men viss det er hotlenkja, vil det sjå slik ut:

4) Stogga det heilt

For å stogga hotlenking heilt, og dimed faktisk spara bandbreidde, er det berre .htaccess-fila som trengst. Line 11 fjernast, og line 12 (no 11) er endra:

1
2
3
4
5
6
7
8
9
10
11
12
13
# BEGIN Stogg hotlenking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?nettstadendin\.no.*$ [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteRule (.*) - [F]
</IfModule>
# END Stogg hotlenking

På nettstaden ser biletet heilt normalt ut, men viss det er hotlenkja, vil folk ikkje få noko bilete:

Bilete

Finn tjuvane

Ein måte å finna tjuvane på, er å bruka søkjemotorane. Biletsøket til Google, til dømes. Du treng heldigvis ikkje leita opp eitt og eitt bilete. Ved å bruka inurl:nettstadendin.no, søkjer Google etter alle bileta som inneheld adressa til nettstaden, og ved å søkja -site:nettstadendin.no, søkjer Google på alle bileta som ikkje er synt fram på nettstaden (legg merke til minusteiknet). Søket er altså: inurl:boba.no -site:boba.no

Denne metoden er ikkje heilt perfekt. Google ignorerer visst punktumet, så eg får heilt irrelevante treff frå til dømes festinhabobanoape.com, av di Google finn «bobano» midt inni adressa. Dessutan fangar denne metoden ikkje opp alle bileta som vert hotlenkja, og viser heller ikkje omfanget. Ein annan måte er difor å loggføra treffa sjølv. Dette gjer me med .htaccess og PHP.

Me kan starta med .htaccess-fila. Me gjer nøyaktig det same som då me laga vassmerke:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# BEGIN Stogg hotlenking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?nettstadendin\.no.*$ [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{REQUEST_URI} !^/hotlink\.php*$
RewriteRule (.*) hotlink.php?fil=$1
</IfModule>
# END Stogg hotlenking

Me oppretter så PHP-fila hotlink.php. Innhaldet er ganske likt det me gjorde då me skulle vassmerka bileta. Linene 22-26 er der loggføringa skjer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$fil = strip_tags( $_GET['fil'] );
// Skriptet skal alltid ha variabelen $fil.
// Skriptet skal alltid visa til ei eksisterande fil.
if ( ! $fil || !file_exists($fil) ) {
	die("Error: Image not found"); // stogg skriptet viss feil vilkår
}
 
// finn filtype (jpg, png, gif) og hent inn biletet
$filinfo = pathinfo($fil);
if($filinfo['extension']=="png"){
	$biletet = imagecreatefrompng($fil);
}elseif($filinfo['extension']=="gif"){
	$biletet = imagecreatefromgif($fil);
}elseif($filinfo['extension']=="jpg" || $filinfo['extension']=="jpeg"){
	$biletet = imagecreatefromjpeg($fil);
}else{
	die("Error: Not an image"); // stogg skriptet viss feil filtype
}
 
// Loggfør tjuvane i CSV-format
$kjelde = $_SERVER['HTTP_REFERER']; // Tjuven
$dato = date("Y-m-d,H:i:s");
$loggen = fopen("vassmerketjuvane.csv",'ab');
fwrite($loggen, "$dato,$kjelde,$fil\r\n");
fclose($loggen);
 
// Send til nettlesaren og avslutt
header('Content-type: image/png');
imagepng($biletet);
imagedestroy($biletet);
?>

Kvar gong nokon er innom ei side som hotlenkjar frå deg, vil dette loggførast i ei CSV-fil. Denne kan du lasta ned og opna som eit rekneark, og tydeleg sjå kven tjuvane er. Med denne metoden vil dei hotlenkja bileta sjå heilt normale ut. Du kan sjølvsagt også bruka vassmerke. Som eg skreiv innleiingsvis, er hotlenking merkbart i trafikken på tenaren min. No har eg loggført eit par dagar, og ser tendensane til kva som er den største tjuven:

Dette biletet av Kyle Katarn er 95 kB. Så godt som ingenting, altså. Men vevstaden som har hotlenkja det er eit forum med mange brukarar. Ein av brukarane på forumet har dette biletet som avatar, hotlenkja. Så dette biletet vil stå attmed kvar einaste post ho eller han skriv, og kvar gong ein person tittar innom forumet og desse postane, må nettstaden min dela ut 95 kB til vitjaren av forumet. Det ballar fort på seg med utsendt data då. Eg har i skrivande stund loggført i underkant av tre døger. På denne tida har forumet brukt kring 70 MB på mi rekning! I løpet av eit år vil dei ha då «lånt» kring 8,3 GB bandbreidde frå meg!

Sidan eg ikkje veit korleis eg får kontakt med denne personen, har eg sendt ei høfleg men streng melding til forumadmin der eg bed dei informera brukaren om at dette er tjuveri, og føreslo at ho eller han kan kopiera biletet til ein eigen tenar eller ein gratis biletlagringsteneste, eller finna seg ein ny avatar. Dersom ingenting hender, kjem eg til å innføra ein ny regel i .htaccess-fila mi spesifikk for dette forumet. Eg tenkjer skjermbilete frå Pink Flamingos… ein GIF av Singing Asshole, kanskje…

  1. Tenaren må køyra Apache med mod_rewrite, men det finst liknande metodar til andre vevtenarar. Søk etter «URL Rewrite for IIS» eller liknande []
  2. PHP må ha GD-utvidinga. []

2 innspel

  1. Egil

    Det som er litt keisamt er at bileta blir vassmerka i straumlesaren 🙂

  2. Simon

    Å, ja, ser det no. Skal prøva å leggja til unnatak for det.

Gje innspel