Beveiligd downloaden met .htaccess
Ik heb een vraag, misschien is tie makkelijk, maar na 3, 4 dagen zoeken ben ik er nog niet uit. Het is namelijk zo:
Iemand betaald online met PayPal.
Van PayPal wordt diegene doorgestuurd naar een invulpagina om een download-code in te vullen. De klant vult de code in en komt op de (beveiligde) pagina.
Daar staat een link om de download te downloaden. Tot dit punt snap ik het. Nou komt het moeilijke:
Je hebt het bestand (een .mp3-bestand) en die staat in de map downloaden. De link op de (beveiligde pagina) linkt daarnaar toe. Maar als je nou rechtstreeks de link intypt (www.example.com/downloaden/test.mp3 bijvoorbeeld) dan kom je gelijk bij het bestand zonder het eerst te betalen. Nou dacht ik dat moet met .htaccess, en ik was er bijna want ik had het gevonden dat hij lezen via de browser blokkeerd mar met de PHP-functie: readfile dan zie je allemaal rare tekens, wat, denk ik, de basis is van een .mp3 bestand ofzo). Hoe kun je zo'n bestand nou zo beveiligen dat niemand het kan downloaden maar wel via een andere pagina ofzo.
Ik hoop dat jullie een oplossing hebben!
Options +FollowSymLinks
#nette urls
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
Nee, echt niet. Dan heb je nog geen controle of de gebruiker wel/niet betaald heeft! De oplossing die Pim geeft is een goede...
Neemt niet weg dat je echt fatsoenlijke controle moet doen op de naam, dan wel het pad.
Volgens mij kun je dat probleem wegvangen door sessies te gebruiken. De combinatie van een sessie met het htaccess bestand voorkomt een benadering van de link door gebruikers die niet betaald hebben. Dit is volgens mij het meest waterdicht.
http://www.phptuts.nl/snippets/overig/downloadscript.php
De meest eenvoudige methode lijkt me verder door de map met downloads buiten de webroot te zetten, op die manier kunnen bestanden in die map nooit van buitenaf benaderd worden.
@Peter: ik heb niet goed naar het script gekeken, maar de methode is wel een goede. Hier een veilige variant: De meest eenvoudige methode lijkt me verder door de map met downloads buiten de webroot te zetten, op die manier kunnen bestanden in die map nooit van buitenaf benaderd worden.
Op shared hosts kan dat vaak niet en ook is "deny from all" in je htaccess toch gewoon voldoende? Jouw script geeft altijd het 'application/octet-stream' mime type mee, dat schijnt niet netjes te zijn. ( Maar vraag me niet waarom )
Ik denk trouwens dat het veiliger is om de realpath te nemen van de locatie en dan te kijken of die onder de download-root zit in plaats van te kijken of er twee puntjes in zitten, dat ziet er kwetsbaar uit.