Hallo,

Heb een website met inlogdeel waarachter enkele PDF documenten staan. Ik wil dat deze niet geopend kunnen worden als je niet ingelogd bent. Dat kan natuurlijk nu wel, middels de directe link van de PDF.
Nu kan ik de PDF van een wachtwoord voorzien, maar is er ook een mogelijkheid om de link te coderen, of iets dergelijks?

Kon niet echt een goede categorie voor dit topic vinden, dus daarom hier maar geplaatst ;-).

Mvg, Guido
Je kan de link wel coderen of moeilijk voorspelbaar maken, maar een echte goede beveiliging is een authenticatie met gebruikersnaam en wachtwoord.

Dus zet je bestanden buiten je webroot, en laad je met readfile() en de juiste headers in op het moment dat iemand ingelogd en de rechten heeft om het te downloaden.
Dat ziet er veelbelovend uit.

Heb nu onderstaande code inclusief PDF op mijn server gezet maar krijg constant de melding van Adobe dat de PDF niet geopend kan worden omdat bestandstype niet ondersteund wordt of niet goed gecodeerd is... Terwijl hij normaal gesproken gewoon opent.

Vergeet ik iets in onderstaande?


<!DOCTYPE html>
<html>
<body>

<?php
$file = 'file.pdf';
if (file_exists($file)) {
	header('Content-Type: application/pdf');
	header('Content-Disposition: attachment; filename="'.basename($file).'"');
	readfile($file);
	exit;
}
?> 

</body>
</html>


Guido
Ik zou deze headers gebruiken:

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
Ook niet helaas.
Maar op Stackoverflow zag ik deze headers en dit werkt wél..


header('Content-Length: ' . filesize($file));
header('Content-type: application/octet-stream'); 
header('Content-disposition: attachment; filename="'.basename($file).'"'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
ob_clean(); 
flush(); 
readfile($file);


Begrijp alleen nog niet waarom dit wél werkt..

Guido
Haal de html die je er omheen hebt gezet eens weg.
Hoi Ozzie,

Het werkt nu al, met de headers die ik van Stackoverflow gehaald heb.
Stel dat ik dit (inclusief PDF) wél binnen de webroot zet, hoe komt men dan achter de directe link vh bestand? Ik zie em niet namelijk.

Guido
Als je de bestanden binnen de webroot zet, dan kan iedereen ze inzie als ze de URL weten.
Dus zet de bestanden buiten de webroot, haal ze daar op via readfile().

Je kan dan een script maken die ze ophaalt via: download.php?file=factuur-20160354321.pdf
Uiteraard moet je niet een controle vergeten in te bouwen die de gebruiker authenticeert.
>> Stel dat ik dit (inclusief PDF) wél binnen de webroot zet, hoe komt men dan achter de directe link vh bestand?

Geen idee ... door op de gok te proberen het bestand aan te roepen ...

www.jouwsite.nl/files/geheimpje.pdf
- Ariën - op 15/03/2016 00:05:18

Als je de bestanden binnen de webroot zet, dan kan iedereen ze inzie als ze de URL weten.


Ook als je de map volledig blokkeert met htaccess?

deny from all
<Files "*.*">
Order Allow,Deny
Deny from all
</Files>


Dan zijn de documenten niet publiekelijk zichtbaar. Maar als het buiten de webroot kan, dan is dat zeker aan te raden. Stel je voor dat er opeens Nginx i.p.v. Apache wordt gebruikt, die niet met .htaccess werkt. Dan is alles opeens weer openbaar.

Reageren