directe link naar images blokkeren
nou is het ook mogelijk dat de foto benaderd wordt door de directe link als url op te geven, maar ik wil dat er dan een forbidden melding komt. Hoe doe ik dat?
De image-bestanden staan in deze structuur:
mijndomein.nl/albums/album1/foto1.jpg
Dus alles in submappen in /albums/
Gewijzigd op 25/01/2016 17:04:35 door - Ariën -
Of je mappen buiten je webdir zetten als deze afbeeldingen toch via een script geserveerd worden.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
Als je een lege referrer wilt toestaan kun je regel 2 weg laten.
Ik begrijp nog steeds niet volledig hoe dat werkt met htaccess, want met deny from all, kan ik wel voorkomen dat er een directe link naar php-bestanden gemaakt wordt, maar niet naar een jpg file. Ook bv. een css bestand wordt niet uitgevoerd door het script als ik deny from all zet. (de css wordt via de head geladen)
En ik zou graag de map buiten de root plaatsen, maar de host staat dit niet toe.
Toevoeging op 25/01/2016 17:26:13:
@Ben: Ik heb deze regels in de .htaccess in de map albums toegevoegd, maar dat voorkomt nit dat ik de afbeelding rechtstreeks kan openen.
Gewijzigd op 25/01/2016 17:19:08 door tortuga web
Tortuga web op 25/01/2016 17:17:29:
@Ariën: Nee, want dan krijgt het script ook geen toegang.
Niet waar. Via PHP wordt de foto via het filesystem opgevraagd, en het gaat dus niet via de webserver. Je kan die .htaccess toch in de map zetten waar de foto's in staan?
Ik neem aan dat er geen andere bestanden instaan die je niet geblokkeerd wilt hebben.
Welke webserver gebruik je eigenlijk?
Gewijzigd op 25/01/2016 17:30:31 door - Ariën -
<files *.*>
order allow,deny
deny from all
</files>
En vervolgens ga ik naar de webpagina, roep de albums aan en zie vervolgens alles behalve de foto´s waar die er eerst wel waren. Wat doe ik dan niet goed.
Ik test met Wampserver
En om het nog erger te maken: via het script kom ik niet bij de images, maar via de directe link wel
Gewijzigd op 25/01/2016 17:44:05 door tortuga web
deny from all alleen al, zou moeten werken. Desnoods kan je er met .htaccess een wachtwoord op gooien als dat niet werkt.
Met deny from all worden de images ook door het script geblocked.
Met een htpassword, dit heb ik op de hostserver getest niet in wamp, worden de images ook geblocked.
Is er geen andere methode?
Gewijzigd op 25/01/2016 18:20:31 door - Ariën -
Quote:
Dat lijkt me een beetje kort door de bocht.
Hangt van het script af, als hier verder geen authenticatie checks of wat dan ook in zitten is dit script enkel een doorgeefluik.
Ook heeft de TS niet aangegeven dat het probleem hotlinking betreft, enkel dat de afbeeldingen niet rechtstreeks aangeroepen mogen worden.
Code (php)
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
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
<?php
if (!$bestanden = glob($map.'/*.*')) {
$bestanden = array();
}
foreach ($bestanden as $bestand) {
if (($bestand !== $map.'/.') AND ($bestand!== $map.'/..')) {
$gegevens = getimagesize($bestand);
$extensie = $gegevens['mime'];
if ($extensie == 'image/jpeg' || $extensie == 'image/gif' || $extensie == 'image/png') {
$afbeeldingen[] = $bestand;
}
}
}
$aantalfotos = count($afbeeldingen);
if (isset ($afbeelding)) {
foreach ($afbeeldingen as $id => $naam) {
if (basename($naam) == $afbeelding) {
$fotonr = $id;
}
}
if (isset ($fotonr)) {
$afbeelding = pathinfo($afbeeldingen[$fotonr]);
if ($fotonr > 0) {
$vorige_afbeelding = pathinfo($afbeeldingen[$fotonr - 1]);
echo '<a href="?pagina=fotoalbum&album='.$map.'&afbeelding='.$vorige_afbeelding['basename'].'" title="Ga naar foto '.$vorige_afbeelding['basename'].'"><< Vorige</a>';
}
?>
if (!$bestanden = glob($map.'/*.*')) {
$bestanden = array();
}
foreach ($bestanden as $bestand) {
if (($bestand !== $map.'/.') AND ($bestand!== $map.'/..')) {
$gegevens = getimagesize($bestand);
$extensie = $gegevens['mime'];
if ($extensie == 'image/jpeg' || $extensie == 'image/gif' || $extensie == 'image/png') {
$afbeeldingen[] = $bestand;
}
}
}
$aantalfotos = count($afbeeldingen);
if (isset ($afbeelding)) {
foreach ($afbeeldingen as $id => $naam) {
if (basename($naam) == $afbeelding) {
$fotonr = $id;
}
}
if (isset ($fotonr)) {
$afbeelding = pathinfo($afbeeldingen[$fotonr]);
if ($fotonr > 0) {
$vorige_afbeelding = pathinfo($afbeeldingen[$fotonr - 1]);
echo '<a href="?pagina=fotoalbum&album='.$map.'&afbeelding='.$vorige_afbeelding['basename'].'" title="Ga naar foto '.$vorige_afbeelding['basename'].'"><< Vorige</a>';
}
?>
O.a. met bovenstaande haal ik foto´s op. De basis van dit script heb ik van een tutorial van phphulp
Gewijzigd op 25/01/2016 18:31:20 door tortuga web
Kan je met readfile() wel in je beveiligde directory komen?
Gewijzigd op 25/01/2016 18:35:57 door - Ariën -
Ja, dat lukt wel
Met readfile() kan je prima de afbeeldingen via PHP inladen. Let er wel op dat je juiste headers meegeeft.
Toevallig een tip (van de sluier) :)?