Tutorials
Downloads beveiligen
In deze tutorial ga ik je uitleggen hoe je ervoor kan zorgen dat niet iedereen bestanden, met gevoelige informatie, van je webserver kan downloaden.
Pagina 1
Het afschermen van de map
Dit script beschermd je belangrijke bestanden tegen "illegaal" downloaden door niet geautoriseerde gebruikers.
Als je een bestand (bijvoorbeeld: wachtwoord.doc) opgeslagen hebt in /htdocs/files, kan iedereen dat bestand downloaden.
Simpelweg surfen naar: http://www.jedomein.nl/files/wachtwoord.doc en je wachtwoord bestand is in handen van de verkeerde personen.
Ik weet dat er manieren zijn om je *.doc documenten te beveiligen met wachtwoord bescherming (makkelijk te kraken) of encryptie, maar we willen helemaal niet dat iemand je bestand in handen krijgt.
Dit direct downloaden gaan we voorkomen door een .htaccess bestand te plaatsen in de /files map.
Maak een .htaccess bestand aan, met de volgende 2 regels:
Order deny,allow
deny from all
Plaats dit bestand in de map "files". Als het goed is kan nu niemand meer bij de data in deze map.
Als je een bestand (bijvoorbeeld: wachtwoord.doc) opgeslagen hebt in /htdocs/files, kan iedereen dat bestand downloaden.
Simpelweg surfen naar: http://www.jedomein.nl/files/wachtwoord.doc en je wachtwoord bestand is in handen van de verkeerde personen.
Ik weet dat er manieren zijn om je *.doc documenten te beveiligen met wachtwoord bescherming (makkelijk te kraken) of encryptie, maar we willen helemaal niet dat iemand je bestand in handen krijgt.
Dit direct downloaden gaan we voorkomen door een .htaccess bestand te plaatsen in de /files map.
Maak een .htaccess bestand aan, met de volgende 2 regels:
Order deny,allow
deny from all
Plaats dit bestand in de map "files". Als het goed is kan nu niemand meer bij de data in deze map.
Pagina 2
Het PHP script
Voordat we nu verder gaan, ga ik ervan uit dat je al een op sessies gebaseerd inlog systeem hebt op je website en dat er een sessie variable $_SESSION['userID'] wordt aangemaakt bij het inloggen.
Dan gaan we nu het volgende PHP bestand aanmaken:
<?php
//Deze regel is belangrijk! Verwijder deze regel niet, anders werkt het downloaden in IE niet goed meer.
session_cache_limiter('private');
error_reporting(E_ALL);
if(!isset($_SESSION)){
session_start();
}
if(!isset($_SESSION['userID'])){
echo "Niet ingelogd!";
exit();
}
if(!isset($_REQUEST['uri']) || empty($_REQUEST['uri'])){
echo "Geen url opgegeven!";
exit();
}
$file = substr($_REQUEST['uri'], strrpos($_REQUEST['uri'],"/")+1);
$file = htmlspecialchars($file);
$folder = realpath('files');
if(!file_exists($folder.'/'.$file)){
echo "Bestand bestaat niet!";
exit();
}
$mime = mime_content_type($folder.'/'.$file);
header("Content-Type: ".$mime);
header("Content-Length: ".filesize($folder.'/'.$file));
header("Content-Disposition: attachement; filename=".$file);
header("Content-Transfer-Encoding: binary");
$fp = fopen($folder.'/'.$file,"r");
fpassthru($fp);
fclose($fp);
?>
Dit bestand slaan we op als download.php in de ROOT map (in apache dus vaak /htdocs)
Dan gaan we nu het volgende PHP bestand aanmaken:
<?php
//Deze regel is belangrijk! Verwijder deze regel niet, anders werkt het downloaden in IE niet goed meer.
session_cache_limiter('private');
error_reporting(E_ALL);
if(!isset($_SESSION)){
session_start();
}
if(!isset($_SESSION['userID'])){
echo "Niet ingelogd!";
exit();
}
if(!isset($_REQUEST['uri']) || empty($_REQUEST['uri'])){
echo "Geen url opgegeven!";
exit();
}
$file = substr($_REQUEST['uri'], strrpos($_REQUEST['uri'],"/")+1);
$file = htmlspecialchars($file);
$folder = realpath('files');
if(!file_exists($folder.'/'.$file)){
echo "Bestand bestaat niet!";
exit();
}
$mime = mime_content_type($folder.'/'.$file);
header("Content-Type: ".$mime);
header("Content-Length: ".filesize($folder.'/'.$file));
header("Content-Disposition: attachement; filename=".$file);
header("Content-Transfer-Encoding: binary");
$fp = fopen($folder.'/'.$file,"r");
fpassthru($fp);
fclose($fp);
?>
Dit bestand slaan we op als download.php in de ROOT map (in apache dus vaak /htdocs)
Pagina 3
De laatste stap
In feite zou het beveiligd downloaden nu al moeten werken via: http://www.jedomein.nl/download.php?uri=/wachtwoord.doc
Ik vind het persoonlijk mooier als we je bestand kunnen gaan downloaden door: http://www.jedomein.nl/sdl/wachtwoord.doc
Dit gaan we op de volgende manier mogelijk maken:
We gaan weer een .htaccess bestand maken en deze gaan we plaatsen in de root map.
Je htaccess bestand moet de volgende regels bevatten:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/sdl/.*$
RewriteRule ^.*$ /download.php?uri=%{REQUEST_URI}
Vanaf nu is het dus mogelijk om via http://www.jedomein.nl/sdl/wachtwoord.doc dit bestand te downloaden, maar alleen als je bent ingelogd!
LET OP: Deze laatste Rewrite Condities werken dus alleen in Apache met de Rewrite Module geactiveerd!
Ik vind het persoonlijk mooier als we je bestand kunnen gaan downloaden door: http://www.jedomein.nl/sdl/wachtwoord.doc
Dit gaan we op de volgende manier mogelijk maken:
We gaan weer een .htaccess bestand maken en deze gaan we plaatsen in de root map.
Je htaccess bestand moet de volgende regels bevatten:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/sdl/.*$
RewriteRule ^.*$ /download.php?uri=%{REQUEST_URI}
Vanaf nu is het dus mogelijk om via http://www.jedomein.nl/sdl/wachtwoord.doc dit bestand te downloaden, maar alleen als je bent ingelogd!
LET OP: Deze laatste Rewrite Condities werken dus alleen in Apache met de Rewrite Module geactiveerd!
Reacties
0