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ż:Szukajka
Ilość komentarzy: 6
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
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
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…
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.
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
- Fabryka Spamu wykorzystuje zmodyfikowaną skórkę Lemon Twist. Blog na licencji CC by-nc-sa v.3 więcej...
- Do góry...
- Główna



Zostaw komentarz-