Afschermen geuploade documenten in een CMS-website
Hallo,
Ik heb een CMS-website gebouwd waarbij de gebruikers de inhoud van de pagina's kunnen bewerken maar ook documenten (pdf's e.d.) kunnen uploaden. Voor het bewerken van de paginainhoud maak ik gebruik van CKeditor, voor het documentbeheer maak ik gebruik van CKfinder.
Om van de website gebruik te kunnen maken dienen gebruikers in te loggen. De geuploade documenten komen in submappen terecht. (Ingesteld via CKfinder).
Hoe kan ik het zo inrichten dat documenten alleen via de applicatie benaderd kunnen worden en niet via een internetbrowser als je de url weet tenminste?
Ik weet dat ik internetmappen kan beveiligen met een gebruikersnaam/wachtwoord via .htaccess. Maar als ik de documenten in een internetmap benader via de website is het niet gebruikersvriendelijk dat dan eerst nog een gebruikersnaam of wachtwoord ingevoerd moet worden. Kan ik met php programmeren tegen .htaccess o.i.d.?
Is het mogelijk om een soort van wrapper te bouwen, een php-programma dat automatisch opstart als een document in internetmap wordt benaderd en dat dan kijkt of de gebruiker de gewenste sessie instellingen heeft, zo ja dan kan het document worden getoond, zo nee dan volgt een foutmelding.
Wie heeft ervaring met dit soort zaken en tips voor mij?
gr. Simson
Ik heb een CMS-website gebouwd waarbij de gebruikers de inhoud van de pagina's kunnen bewerken maar ook documenten (pdf's e.d.) kunnen uploaden. Voor het bewerken van de paginainhoud maak ik gebruik van CKeditor, voor het documentbeheer maak ik gebruik van CKfinder.
Om van de website gebruik te kunnen maken dienen gebruikers in te loggen. De geuploade documenten komen in submappen terecht. (Ingesteld via CKfinder).
Hoe kan ik het zo inrichten dat documenten alleen via de applicatie benaderd kunnen worden en niet via een internetbrowser als je de url weet tenminste?
Ik weet dat ik internetmappen kan beveiligen met een gebruikersnaam/wachtwoord via .htaccess. Maar als ik de documenten in een internetmap benader via de website is het niet gebruikersvriendelijk dat dan eerst nog een gebruikersnaam of wachtwoord ingevoerd moet worden. Kan ik met php programmeren tegen .htaccess o.i.d.?
Is het mogelijk om een soort van wrapper te bouwen, een php-programma dat automatisch opstart als een document in internetmap wordt benaderd en dat dan kijkt of de gebruiker de gewenste sessie instellingen heeft, zo ja dan kan het document worden getoond, zo nee dan volgt een foutmelding.
Wie heeft ervaring met dit soort zaken en tips voor mij?
gr. Simson
Het beste is om zulke bestanden buiten de webroot te plaatsen (buiten public_html, htdocs, etc).
Bestanden vraag je nog aan via /uploads/.
Zo ziet de structuur er dan uit:
/www/htdocs/uploads/ -> http://example.com/uploads/
/www/uploaded/ -> niet van buiten bereikbaar.
/www/htdocs/file.php -> http://example.com/file.php, maar wordt niet direct aangeroepen
In /www/htdocs plaats je een .htaccess bestand:
file.php
Bestanden vraag je nog aan via /uploads/.
Zo ziet de structuur er dan uit:
/www/htdocs/uploads/ -> http://example.com/uploads/
/www/uploaded/ -> niet van buiten bereikbaar.
/www/htdocs/file.php -> http://example.com/file.php, maar wordt niet direct aangeroepen
In /www/htdocs plaats je een .htaccess bestand:
file.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$uploadMap = '/www/uploaded/';
$filename = get_absolute_path($_SERVER['QUERY_STRING']);
$file = $uploadMap . $filename;
// even geleend van de PHP Manual :p
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return implode(DIRECTORY_SEPARATOR, $absolutes);
}
if(!file_exists($file)){// bestand niet gevonden
header('HTTP/1.1 404 Not Found');
exit;
}
// lees maar in
// Eventueel Content-Type sturen?
readfile($file);
?>
$uploadMap = '/www/uploaded/';
$filename = get_absolute_path($_SERVER['QUERY_STRING']);
$file = $uploadMap . $filename;
// even geleend van de PHP Manual :p
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return implode(DIRECTORY_SEPARATOR, $absolutes);
}
if(!file_exists($file)){// bestand niet gevonden
header('HTTP/1.1 404 Not Found');
exit;
}
// lees maar in
// Eventueel Content-Type sturen?
readfile($file);
?>




