Beveiligd downloaden met .htaccess
Hallo lezers,
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!
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!
Volgens mij heb je meer baat bij het redirecten van de gebruiker via de .htaccess via de volgende code:
Options +FollowSymLinks
#nette urls
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
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...
Het script in de link van Pim is onveilig. Als je geen directories gebruikt, dan zou je $file=basename($file); kunnen doen.
Neemt niet weg dat je echt fatsoenlijke controle moet doen op de naam, dan wel het pad.
Neemt niet weg dat je echt fatsoenlijke controle moet doen op de naam, dan wel het pad.
@Blanche
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.
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.
@Peter: ik heb niet goed naar het script gekeken, maar de methode is wel een goede. Hier een veilige variant: 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.
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.
@Blanche
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.
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.




