'downloadables' alleen toegankelijk voor mensen die ingelogd zijn

Status
Niet open voor verdere reacties.

jannetwiel

Gebruiker
Lid geworden
2 apr 2001
Berichten
95
Ik heb een website gemaakt die alleen toegankelijk is voor collega's. In elke webpage staat een stukje php-code waarmee gecheckt wordt of de persoon die de pagina opvraagt wel is ingelogd. Dit werkt goed. Echter, er zitten ook 'downloadables' op de site, zoals Word-bestanden en pdf's. Hoe kan ik nou voorkomen dat mensen die niet zijn ingelogd via het intikken van de url van het betreffende bestand toch toegang kunnen krijgen? Er staan wel geen super-geheime zaken in die bestanden, maar ik wil mijn collega's toch wel garanderen dat niet allerlei persoonlijke gegevens voor iedereen toegankelijk zijn op het web.
 
Er zijn twee eenvoudige manieren:

1.
de folder waar de downloads in staan met htaccess en htpasswd beveiligen en in het php script een aanmelding maken daarvoor boven op de bestaande login beveiliging.

2.
de downloads buiten de webroot zetten en met een script de downloads laten laden. Het script kan met de header zichzelf als ieder bestandstype identificeren en leest dan de binaire inhoud van de gekozen download in "zichzelf" zeg maar. De bezoeker merkt daar niets van en je kunt dan bestanden die buiten de webroot staan toch als download aanbieden.

Ik gebruik meestal optie 2, een script daarvoor kun je vrij eenvoudig vinden. Vaak wordt het "forced download" genoemd omdat een eigenschap van deze constructie is dat je met links klikken ook een download krijgt in plaats van dat het bestand in de browser geopend wordt.
 
Hey MAX,

Bedankt voor de tips. Ziet er niet al te ingewikkeld uit, dus ik ga er maar eens mee aan de slag.


Jannet
 
Hi Jannet,

hier heb je een voorbeeld functie:


  • $bestands_naam: de echte naam bijv. mijnfoto.jpg
  • $relatieve_pad: meestal iets zoals /home/www/mijnsite/, zorg ervoor dat je hier een map kiest buiten de webroot. Als /home/www/mijnsite/ de webroot is zet de bestanden dan in /home/www/ dan is het onbereikbaar voor anderen
  • $database_naam: de naam die je naar de buitenwereld wilt gebruiken bijv. Mijn Foto.jpg
  • $database_titel: de titel die je naar de buitenwereld wilt gebruiken bijv. Mijn Foto


function NBServeerBestand($bestands_naam,$relatieve_pad,$database_naam,$database_titel)
{
$ext = substr($database_naam, -3);
switch($ext)
{
case "doc":
$type = "application/msword";
break;
case "dot":
$type = "application/msword";
break;
case "ppt":
$type = "application/vnd.ms-powerpoint";
break;
case "pot":
$type = "application/vnd.ms-powerpoint";
break;
case "xls":
$type = "application/vnd.ms-excel";
break;
case "vcs":
$type = "text/calendar";
break;
case "txt":
$type = "text";
break;
case "pdf":
$type = "application/pdf";
break;
case "exe":
$type = "application/exe";
break;
case "zip":
$type = "application/zip";
break;
}
$titel = $database_titel.".".$ext;
header('Content-Type:' . $type);
header("Content-Description: Download");
header("Pragma: public");
header("Expires: 1"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Disposition: attachment; filename=$titel");
header("Content-Transfer-Encoding: binary");
$bestands_locatie = $relatieve_pad.$bestands_naam;
$bestand_bin = fopen($bestands_locatie,"rb");
fpassthru($bestand_bin);
$fp = fopen($relatieve_pad, 'rb');
if($ext != "txt")
{
$bestand_gebufferd = fread($bestand_bin, $filesize);
fclose ($bestand_bin);
sleep(1);
print $bestand_gebufferd;
}
exit();
} // Einde functie
 
Voor ik het vergeet: zorg ervoor dat wanneer je deze functie aanspreekt er geen HTML output in het script zit, anders krijg je errors door de HEADERS.

Uiteraard kun je enkele variabelen bundelen als je geen koppeling nodig hebt met een database. Het bestand wat je dan gebruikt kan zijn:

bestand.php

<?php
require("config.php"); // zet hier je relatieve pad in en plaats die variabele als tweede in de functie
require("functies.php"); // zet hier de functie in zodat je het door heel je systeem kunt aanroepen

if(isset($_GET[bestand]))
{
NBServeerBestand($_GET[bestand],$mijn_relatieve_pad,"mijn_bestand.doc","Mijn Bestand");
}
else
{
echo "U heeft geen bestand aangeroepen.";
}
}
?>
 
Hoi MAX,


Weer bedankt voor de tips. Ik heb een combinatie van de twee door jou genoemde aanpakken gemaakt. Ik maak gebruik van een forced download en heb de bestanden in een beveiligde map gezet, maar niet buiten de root. Dat werkt.

Met jouw aanvullingen kan ik de boel nog wat meer stroomlijnen.

Groet,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan