[.htaccess] hotlink beveiliging

Pagina: 1
Acties:
  • 106 views sinds 30-01-2008
  • Reageer

  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Edit: Probleem is opgelost

Na verschillende topics hier op GOT door te hebben gelezen heb ik een .htaccess bestand aangemaakt met als doel om hotlinking tegen te gaan.

Mijn probleem is het me niet lukt om hotlink beveiliging via .htaccess goed werkend te krijgen. Ik heb het gevoel dat ik alles goed doe, uiteraard zie ik iets over het hoofd, maar wat?

Probleem: Als ik nu lokaal het plaatje probeer te bekijken zie ik een rood kruis.
Als ik het plaatje rechtstreeks probeer te bekijken krijg ik een 403 “forbidden” melding.

Ik wil graag dat de site bezoekers het plaatje wel gewoon kunnen bekijken (logisch :)).
Als ik het .htaccess bestand weghaal lukt dat ook gewoon, maar dan is de hotlink beveiliging weg.

Heeft iemand enig idee waar het mis gaat?

Directe link naar het plaatje:
http://gebruiker.net/temp/test.jpg

Test pagina lokale server (protagonist server):
http://gebruiker.net/hotlink.html

Test pagina remote server (chello):
http://members.chello.nl/l.molenaar/hotlink.html

.htaccess geplaatst in /httpdocs/temp/ (locatie van het plaatje):
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?gebruiker.net(/)?.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|bmp|png)$ http://www.gebruiker.net/pic/hotlink.jpg [R,NC]

  • Ook
  • Registratie: September 2000
  • Laatst online: 14-12-2025

Ook

Yes I can!

Ik denk dat het mis gaat door dat "www" gedeelte erin (of bv door het beruik van een .); die van mij ziet er zo uit en dat werkt prima:
code:
1
2
3
4
5
6
7
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://domein\.nl/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://domein\.nl.*$  [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.domein\.nl/.*$    [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.domein\.nl.*$ [NC]
RewriteRule \.(jpg|jpeg|gif|png|bmp|doc|pdf)$ http://www.anderdomein.nl/thief.jpg [R,NC]

Wees consequent, maar niet altijd


  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
ik heb nu de .htaccess veranderd naar:
code:
1
2
3
4
5
6
7
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://gebruiker\.net/.*$    [NC]
RewriteCond %{HTTP_REFERER} !^http://gebruiker\.net.*$    [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.gebruiker\.net/.*$    [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.gebruiker\.net.*$    [NC]
RewriteRule \.(jpg|jpeg|gif|png|bmp|doc|pdf)$ http://www.gebruiker.net/pic/hotlink.jpg [R,NC]


Maar dit lost helaas niets op.
Ik heb hetzelfde resultaat :(

403 forbidden

Verwijderd

Stomme vraag, maar is je plaatje goed geCHMOD ?

  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Verwijderd schreef op 09 augustus 2004 @ 14:35:
Stomme vraag, maar is je plaatje goed geCHMOD ?
:) die is goed gechmodded.
Als ik de .htaccess weg haal dan werkt alles gewoon, alleen zonder hotlink beveiliging

  • Ook
  • Registratie: September 2000
  • Laatst online: 14-12-2025

Ook

Yes I can!

Ineens herinner ik me ook nog dat ik bij een webspace provider ooit iets soortgelijks had. Ik heb toen even met die Helpdesk gemailed en zij gaven het advies om dit bovenaan in de .htaccess te zetten en dat werkte toen inderdaad prima.. Don't know what it does though :p
code:
1
Options +SymLinksIfOwnerMatch

Wees consequent, maar niet altijd


  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Helaas werkt dit ook niet :'(
Ik heb een kopie van mijn support query naar mijn webhost gemailed, hopelijk weten ze een oplossing.

het zou natuurlijk helemaal fantastisch zijn als een mede tweaker hen voor zou zijn ;)

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

A List Apart heeft pas een artikeltje geplaatst over hotlink prevention. Is misschien handig om daar eens in te koekeloeren.

http://www.alistapart.com/articles/hotlinking/

Nu met Land Rover Series 3 en Defender 90


  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Het is opgelost :)

de oplossing was om
code:
1
Options +followsymlinks

te gebruiken in plaats van
code:
1
Options +SymLinksIfOwnerMatch

Bedankt allemaal voor de support!
En credits gaan naar Protagonist voor de oplossing en `Ook` voor de bijna oplossing ;)

de werkende .htaccess ziet er zo uit:
code:
1
2
3
4
5
Options +followsymlinks
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?gebruiker.net(/)?.*$ [NC]
RewriteRule \.(jpe?g|gif|bmp|png)$ http://www.gebruiker.net/pic/hotlink.jpg [R,NC]

Verwijderd

Hallo

Werkt deze methode ook als de bezoekers de referrer niet meezenden?
Dus als een Norton Firewall o.i.d. dit weg filtert?
En werkt het ook voor AOL gebruikers die via tig proxy's met nog meer verschillende IP adressen je website bezoeken?

Mijn methode in PHP is om een code te maken die afhankelijk is van de tijd en het IP adres van de bezoeker. Die antileech code wordt meegegeven als argument bij de aanroep van een plaatje. Voordat het plaatje verzonden wordt, wordt het tijdstip en IP adres weer gedecodeerd en gecontroleerd waarna met passthru het plaatje doorgezonden wordt.

Die code is tijdafhankelijk, d.w.z. de gehele wereld kan met behulp van die code het plaatje een minuut lang zien vanaf elk mogelijk IP adres. Dit is handig voor die AOL gebruiker achter tig proxies.
Daarna kan alleen maar het originele IP adres die het plaatje opvroeg het nog zien.
Ieder ander krijgt dan eventueel een plaatje van een bloedzuiger te zien...

Laat maar weten als jullie code willen zien.

  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Eeen blanco referer wordt nu ook geblocked, maar dat is optioneel en kan je eenvoudig uitschakelen.

Ik heb nog niet getest hoe dit werkt gebruik makend van proxies, maar met de links in mijn eerst post is dat eenvoudig te testen.

Ik ben zoiezo wel benieuwd naar je php code :)

  • NEK
  • Registratie: December 2002
  • Laatst online: 24-04 18:47

NEK

Heb je al gekeken bij hotscripts.com of phpfreakz.nl?

  • Ook
  • Registratie: September 2000
  • Laatst online: 14-12-2025

Ook

Yes I can!

Simkin schreef op 10 augustus 2004 @ 10:47:
[...]
En credits gaan naar Protagonist voor de oplossing en `Ook` voor de bijna oplossing ;)
Zat ik er van de Tweakers toch nog het dichtst bij ;)

Wees consequent, maar niet altijd


Verwijderd

Hier de code die ik gebruik:

Onderstaande functies moeten in een include bestand staan en in alle scripts aangeroepen kunnen worden.

code:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
<?
function test_leech_code($no_hotlink,$code,$seed,$minuten)
{
    $testip = substr_replace($no_hotlink,"",0,12);
        
    if ( $testip != $code)  // Als ip adres niet overeenkomt met code
                                          // test dan voor de AOL gebruikers op
    {
        $test = $seed - substr($no_hotlink,0,12);
        if ( $test < 0 || $test > $minuten )    // de minuten grens.
        {                                               
            $no_hotlink = 0;  //  Plaatje is na X minuten wel degelijk hotlinked 
        }
    }
return $no_hotlink; 
}

function antileech($no_hotlink)
{
    $seed = date("YmdHi") - 23131081031;  // Zo nu en dan dat getal wijzigen!
    $ntlch = explode(".",$_SERVER['REMOTE_ADDR']);
    $ntlch[0] = $ntlch[0] + 137;
    $ntlch[1] = $ntlch[1] + 129;
    $ntlch[2] = $ntlch[2] + 132;
    $ntlch[3] = $ntlch[3] + 139;
    $code = strrev(intval($ntlch[1] . strrev($ntlch[2]) . $ntlch[0] . $ntlch[3]) * 3);

    if ($no_hotlink == 0) 
    {
        if (isset($_SESSION['nhtlnk'])) // Constant blijvende IP adressen
                                                                // gewoon toestaan en code per sessie
                                                                // niet te vaak wijzigen. Cache van client                                         
                                                                // wordt dan gebruikt.
            {                               
        $no_hotlink = test_leech_code($_SESSION['nhtlnk'], $code, $seed, 4); 
        // deze test is noodzakelijk voor AOL gebruikers. 
                //( Proxys met 10 ip adressen...)
        }   
        if ($no_hotlink == 0)  // dubbele test vanwege sessie test hierboven.
        {
            $no_hotlink = $seed . $code;
        }
    }
    else 
    {
        $no_hotlink = test_leech_code($no_hotlink, $code, $seed, 5);
    }   
    return $no_hotlink;
}
?>


Ik heb deze code nog niet netter kunnen schrijven....

Daar waar het plaatje moet komen te staan:

code:
1
2
3
4
5
6
7
8
<?
include("dat gezamelijke antileech bestandje");

$nhtlnk = antileech(0);  // 0 betekent maak de code aan!

<img src=nohotlink.php?jpg=".  naamjpg . "&nohotlink=" . $nhtlnk 

?>


en nohotlink.php bevat dan

code:
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
38
39
40
41
42
43
<?
include("dat gezamelijke antileech bestandje");

if (!isset($_GET['nohotlink']))
{
    header("HTTP/1.0 404 Not Found");
    @foutmelding("404 in no hotlink");
    exit;   
}
if (!isset($_GET['jpg']))
{
    header("HTTP/1.0 404 Not Found");
    @foutmelding("Geen sleutel mee ontvangen.");
    exit;
}

$no_hotlink = antileech($_GET['nohotlink']);
$getjpg = veilig($_GET['jpg']);
$getdir = veilig($_GET['dir']);

if ($no_hotlink != $_GET['nohotlink'])
{
    @foutmelding("Geen legale toegang tot foto " . $getdir . " - " . $getjpg);
    $getjpg = "leecher.jpg";
    $fullname = FIMGDIR . "leecher.jpg";
}
else
{
    $fullname = FIMGDIR .  $getjpg . ".jpg";

    if (!file_exists($fullname))
    {
        $fullname = FIMGDIR . "leecher.jpg";
        @foutmelding("Geen foto gevonden met de naam " . $getdir . " - " . $getjpg);
    }
}

header('Content-type: image/jpeg'); 
header('Content-Disposition: inline; filename=' .  $getjpg . ".jpg"); 

$filepump=fopen($fullname, "rb");  
fpassthru($filepump);
?>


Het enig is dat als zo'n hotlinker die tijdcode doorkrijgt, hij dit kan nabootsen met een soortgelijke functie. Vandaar dat je dat getalletje regelmatig moet wijzigen.
Zorg dat je een functie foutmelding hebt om het e.a. te loggen.
Zorg ook voor een functie veilig, waarin je vreemde karakters (b.v. / ) eruit haalt!

Voor verbeteringen in deze code hou ik mij warm aanbevolen!!!!

Met vriendelijke groeten

Gerrit

  • Ook
  • Registratie: September 2000
  • Laatst online: 14-12-2025

Ook

Yes I can!

Gerrit, ff vraagje, wat is het voordeel aan deze code boven .htaccess beveiliging?? Zo op het eerste gezicht is het iig niet simpeler ;)

[ Voor 5% gewijzigd door Ook op 10-08-2004 21:49 ]

Wees consequent, maar niet altijd


Verwijderd

Bezoekers die de referrer weg filteren kunnen de fotos nu ook bekijken.
En dat zijn meer bezoekers dan je denkt. De internetters die een beetje slim zijn installeren firewall's en virusscanners. In Norton firewall wordt de referrer tijdens het browsen niet meegegeven. En niet iedereen weet dat uit te zetten.

Verder komen er op de website die ik onderhoud een aantal AOL gebruikers. Die zitten achter een proxy server met erg veel en totaal verschillende IP adressen. Vroeger kon ik dat opvangen door de antileech code in een sessie-variabele te zetten.

Ik gebruik alleen een sessie om die "code" 4 minuten lang vast te houden. Bij terug bladeren kan dan de cache van de client-browser gebruikt worden.

Voor nohotlink.php gebruik ik geen sessie meer omdat die (sinds PHP 4.3) de headers van de JPG verziekt in micro$oft internet exploderMicrosoft Internet Explorer. Helaas een meerderheid aan bezoekers gebruikt dat...

Zwakte blijft $seed = date("YmdHi") - 23131081031;

Modbreak: Het bedrijf heet Microsoft en dit is een serieuze discussie. Daar hoort geen onnodig geflame of getrol bij. :)

[ Voor 12% gewijzigd door gorgi_19 op 11-08-2004 16:06 ]


  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Maar als een plaatje via een html pagina op de host server wordt aangeroepen zal die toch altijd zichtbaar zijn voor de bezoeker? Ongeacht of die gebruik maakt van een proxy?

Direct linken van plaatjes zal wat lastiger worden, wat precies mijn bedoeling is :)

Als test zou je de link http://gebruiker.net/hotlink.html eens kunnen proberen terwijl je achter een proxy surft.

[ Voor 4% gewijzigd door Simkin op 11-08-2004 11:08 ]


Verwijderd

Ik kon het plaatje zien
http://gebruiker.net/temp/test.jpg
Eens kijken of ik hem hiervandaan ook zie?

  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Verwijderd schreef op 11 augustus 2004 @ 15:00:
Ik kon het plaatje zien
http://gebruiker.net/temp/test.jpg
Eens kijken of ik hem hiervandaan ook zie?
als het goed is krijg je `m dan niet te zien :)

Verwijderd

Vanaf de computer waar ik de html opgevraagd heb, zie ik hem nog steeds.
Vanaf een andere computer zag ik de lamer.

Ik copy&paste de url van het plaatje in IE, mozilla en firefox en krijg hem nog steeds te zien. Ook nadat ik de cache geleegd heb.

Dus als een hotlinker verteld hier staat een plaatje, maar je moet de URL copy&pasten dan krijgen ze gewoon het originele plaatje te zien... Een lekje in dit systeem?

Ik gok dat 98% van de bezoekers dan afhaakt want die willen wel gratis graaien maar geen moeite daarvoor doen. Dan heb je dus nog 2% bezoekers die het plaatje wel zien.

[ Voor 39% gewijzigd door Verwijderd op 11-08-2004 16:04 ]


  • Simkin
  • Registratie: Maart 2000
  • Laatst online: 26-03 21:44
Verwijderd schreef op 11 augustus 2004 @ 15:56:
Vanaf de computer waar ik de html opgevraagd heb, zie ik hem nog steeds.
Vanaf een andere computer zag ik de lamer.

Ik copy&paste de url van het plaatje in IE, mozilla en firefox en krijg hem nog steeds te zien. Ook nadat ik de cache geleegd heb.

Dus als een hotlinker verteld hier staat een plaatje, maar je moet de URL copy&pasten dan krijgen ze gewoon het originele plaatje te zien... Een lekje in dit systeem?

Ik gok dat 98% van de bezoekers dan afhaakt want die willen wel gratis graaien maar geen moeite daarvoor doen. Dan heb je dus nog 2% bezoekers die het plaatje wel zien.
Er zullen er maar weinig zijn die de moeite nemen om de url te copy/pasten, dus
als je de moeite wilt doen om de directe link te pasten in de browser dan heb ik daar geen problemen mee.

Bezoekers van mijn site zullen geen enkele hinder ondervinden omdat alle plaatjes in een locale html/php worden aangeroepen en dus altijd zichtbaar zullen zijn.
Pagina: 1