Fabryka Spamu

Poprawne zabezpieczenie przed hotlinkowaniem

Ostatnio obserwuję coraz częstsze zjawisko kradzieży transferu. Mimo, że koszta są coraz mniejsze, to i tak wiele pokemonów próbuje zaoszczędzić tę złotówkę-dwie i pobierają obrazki, czy pliki Flash-a z serwerów nie do nich należących.
Tradycyjna metoda zabezpieczania się przed hotlinkowaniem polega na umieszczeniu kilku linijek w pliku .htaccess blokujących dostęp do pliku jeśli przeglądarka wyśle informację HTTP_Referer; przykład:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?example\.com/ [NC]
RewriteRule .*\.(png)$ /img/zlodziej.jpg [L]

W tym wypadku za każdym razem, kiedy ktoś/coś spróbuje pobrać któryś z plików .png serwer zwróci plik “img/zlodziej.jpg”.

Sposób ten nie działa niestety, jeśli użytkownik korzysta z niektórych serwerów proxy, ma zainstalowany jeden z kilku firewalli (np. Norton), czy też świadomie blokuje te informacje nie chcąc być łatwo śledzony przez systemy szpiegowskie ;-) (przy okazji polecam wtyczkę do FireFoksa – RefControl). Wszystkie te rzeczy blokują/filrtują właśnie informacje o HTTP_Referer.

Blokada referer jest najprostsza, dlatego leniwi webmajsterzy korzystają właśnie z niej. Znacznie lepszym rozwiązaniem jest na przykład zastosowanie mechanizmu sesji. Przedstawię ten sposób w kilku krokach na przykładzie blokady plików PNG.

0. Zakładam, że wszystkie nasze pliki graficzne mamy w katalogu “img”. Plik, który będzie informować o tym, że mamy do czynienia z hotlinkowaniem ma nazwę “img/kradziez.png”.

1. Tworzymy plik .htaccess i umieszczamy w nim kod:

RewriteEngine On
RewriteRule ^(.*).png$ zab_obr.php?nazwa=$1 [L]

2. W każdym naszym pliku tworzącym kod strony (czyli np. “index.php”) umieszczamy na początku:

<?php
session_start();
$_SESSION['kradziez'] = 'nie';
?>
dalsza część strony...

3. Tworzymy w głownym katalogu plik “zab_obr.php” z następującą zawartością:

<?php
session_start();
$nazwa='./img/' . basename($_GET['nazwa'] . '.png');
if(($_SESSION['kradziez'] == 'nie')&&(file_exists($nazwa))){
header('Content-type: image/png');
readfile($nazwa);
}else{
header('Content-type: image/png');
readfile('./img/kradziez.png');
}
?>

I to właściwie wszystko – w ten sam sposób możemy zabezpieczać każdy typ plików, pamietając o przesyłaniu przez funkcje header() odpowiedniej wartości “Content-type”. Warto ponadto upewnić się, że przekazywanie zmiennej sesyjnej odbywa się za pomocą cookies – w razie problemów, polecam odpowiednią sekcję pomocy php – Sesje.

Przeczytaj również:
  • (6) komentarzy
  • RSS 2.0
  • Delicious bookmark
  • Elefanta.pl
  • Youbookmars
  •  

Subskrybcja

  • Kanał RSS

Ilość komentarzy: 6

Paweł Rabinek - Gravatar

Paweł Rabinek napisał(a):

Dzięki za komentarz do mojego artykułu. Twoja metoda jest dobra i bardziej skuteczna. Nigdy jednak nie musiałem się aż tak bardzo zabezpieczać ;)

PS: Może warto zmienić tło pod tekstem na mniej męczące oczy? ;) Pozdrawiam

Dnia: 11.04.2007 o godz. 16:49Cytuj ten komentarz
mendax - Gravatar

mendax napisał(a):

i obys nigdy nie musial… :-) ja mialem kiedys kradzione ok. 200MB dziennie – trzeba bylo sie porzadnie zabezpieczyc…

koloru nie zmienie – w koncu wedlug niezaleznych badan, spam kojarzy sie z agresja… czyli czerwienia ;-)

Dnia: 12.04.2007 o godz. 17:51Cytuj ten komentarz
alumilut - Gravatar

alumilut napisał(a):

Dzieki i mam nadzieje ze umnie tez zda egzamin.
Pozdrawiam.

Dnia: 16.05.2007 o godz. 10:09Cytuj ten komentarz
pozmu - Gravatar

pozmu napisał(a):

Sposób na pewno skuteczny ale i generujący dużo overhead-u na serwerze (każdy plik graficzny musi być przetworzony), chyba więc nie warty zachodu…

Dnia: 29.05.2007 o godz. 22:23Cytuj ten komentarz
mendax - Gravatar

mendax napisał(a):

W podanym przeze mnie sposobie – owszem, ale te ważne pliki graficzne(to znaczy nie “layout”) można umieścić w osobnym katalogu i dokonać małej zmiany w .htaccess.
Moim zdaniem to i tak lepszy sposób niż “tradycyjne” sprawdzanie HTTP_REFERER.

Dnia: 04.06.2007 o godz. 10:31Cytuj ten komentarz
cr3pt - Gravatar

cr3pt napisał(a):

zastanawia mnie jak mozna by bylo zastosowac twoj skrypt przed linkowaniem plikow z zewnetrznych serwerow-tzn – jest podany np. link do mojego uploadu – ktos klika – wyswietla sie info ze plik “lezy” na serwerze taki, a takim,a po paru sekundach zaczyna sie sciagac – oczywiscie sciaganie po paru selundach jest proste:

function toggleLayer(){
var elem, vis;
if( document.getElementById ) // this is the way the standards work
elem = document.getElementById(‘downloaddiv’);
else if( document.all ) // this is the way old msie versions work
elem = document.all['downloaddiv'];
else if( document.layers ) // this is the way nn4 works
elem = document.layers['downloaddiv'];
vis = elem.style; // if the style.display value is blank we try to figure it out here
if(vis.display==”&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?’block’:'none’;
vis.display = (vis.display==”||vis.display==’block’)?’none’:'block’;
}

Please wait 5 seconds for your download to start…

Click here to download your file…

tyle ze jak rewrite dla tego linkowania??

pozdr
cr3pt

Dnia: 31.05.2008 o godz. 12:48Cytuj ten komentarz


Zostaw komentarz-

Zasady komentowania: przed umieszczeniem swojego komentarza zapoznaj się z zasadami.

Możesz użyć następujące tagi: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Pola oznaczone "*" są wymagane.