Ik heb de volgende vraag. Ik wil een soort fotodatabase maken waarbij men pas na het inloggen bepaalde foto's mag zien. Op zich is het inlogsysteem niet zo spannend en om te bepalen welke foto's wie mag zien stop ik ook in de DB maar hoe voorkom ik dat als men de fotonaam weet men rechtstreeks de foto aanroept via www.domain.com/fotonaam.jpg?
De foto's zouden dus in een beveiligde directory moeten staan maar hoe kan ik ze dan wel tonen als je ingelogd bent.
Vergeet het hele .htaccess verhaal, het kan allemaal veel makkelijker!
Plaats de foto's in een map die zich buiten je webroot bevindt. Op die manier zijn foto's nooit meer via een directe url op te vragen en zijn ze alleen nog via het filesystem van de server (waar PHP wel toegang tot heeft) te benaderen.
Voor het weergeven van een foto gebruik je dan dus ook een PHP script. In dit script kun je dan eerst controleren of de opgevraagde foto (uit een GET variabele) door de betreffende gebruiker bekeken mag worden. Zo ja, dan output je de foto door de juiste headers mee te geven. Zo niet, dan zou je een standaard afbeelding kunnen outputten waaruit blijkt dat de gebruiker geen toegang heeft tot die foto.
Op de pagina waar je de foto's daadwerkelijk weer wilt geven, kun je gewoon een <img> tag gebruiken die er bijvoorbeeld als volgt uitziet:
<img src="getfoto.php?id=1032" />
Op getfoto.php bepaal je vervolgens adhv het id en de database om welke foto het gaat, controleer je of de gebruiker toegang heeft, en toon je eventueel de foto...
ps. Uiteraard zou je de controle of iemand toegang heeft tot een foto ook in een eerder stadium kunnen doen. Het enige dat getfoto.php dan nog hoeft te doen is de juiste foto uit de map laden en outputten als afbeelding.
Testopstelling: www.domein.nl/foto.php aangemaakt met de volgende code:
<img src="./plaatjes/plaatje.gif">
in www.domein.nl/plaatjes/ een htaccess file met een redirect voor alle files naar de foto.php.
Deze redirect werkt en foto.php wordt netjes aangeroepen. Plaatjes worden echter niet getoont maar het bekende vakje met het rode kruisje
Verder heb ik de optie van Evert getest door in de plaatjes directpry een htaccess te maken waarin de volgende code staat:
order allow,deny
deny from all
Ik kom inderdaad niet meer in de plaatjes map maar ook foto.php geeft weer een rood kruisje.
Hoop dat jullie me verder kunnen helpen met wat extra scripts.
Eindelijk weer tijd gehad om te testen. En jawel de optie van Blanche is een goeie! Thanks.
Het was even kijken hoe ik via een php script de foto moest tonen. Dus voor degenen die hetzelfde probleem hebben:
<code>
<?php
// hier kan de code komen te staan voor controle of de afbeelding getoond mag worden
$im = imagecreatefromjpeg("../plaatjes/beveiligd.jpg");
header('Content-type: image/jpeg');
// Output the image
imagejpeg($im);
// Free up memory
imagedestroy($im);
?>
</code>