Beste supertastisch forum,

Ik vroeg me af of het mogelijk is om alle bestanden in een directory te beschermen van mensen die niet ingelogd zijn. En ook haar child directories.

Reden:
Ik had gehoopt het veiliger te maken op deze manier, als ik het dan eens vergeet... :)

groetjes!
phoenix
ik zou de betreffende directory buiten de document root plaatsen, maar een .htaccess file erin zetten met

Deny from ALL


laten we zeggen dat de map heet "geheim"

Dan kun je in de document root een script plaatsen toegangcheck.php

Als je geheim/doc.pdf wilt aanroepen, zul je via toegangcheck.php moeten kijken of het mag.

We zetten in .htaccess erbij:


RewriteEngine On
RewriteRule (.*) /toegangcheck.php?file=$1 [L]


in toegangcheck zet je

<?php
if(true) {
if(is_file($_GET['file'])) {
readfile($_GET['file']);
}

}
else {
echo 'access denied';
}
?>

evt. voor readfile ook nog met header() een contenttype meegeven. zie ook http://php.net/readfile
Waarbij true een controle moet worden of de user ingelogd is.
>> Ik vroeg me af of het mogelijk is om alle bestanden in een directory te beschermen van mensen die niet ingelogd zijn.

Als mensen niet zijn ingelogd, weet je niet zeker wie je voor je hebt en kun je hun bestanden daarom niet goed beveiligen. Wat je het bijvoorbeeld kunt doen:

1. Sla de bestanden op in een directory buiten de root / van de site.

2. Maak in de root bijvoorbeeld een directory /download/ en laat daarin index.php het weergeven en/of downloaden van de bestanden afhandelen. Hier kun je ook de login van gebruikers inbouwen.
Ivo P op 31/10/2014 09:05:39

...
<?php
if(true) {
if(is_file($_GET['file'])) {
readfile($_GET['file']);
}

}
else {
echo 'access denied';
}
?>


En dan doe ik toegangcheck.php?file=./../path/naar/databaseconfig.php en ik zie ineens je database configuratie op mijn scherm staan.
Dat is best aardig.

Op het moment dat je bestanden via een url wilt includen moet je een whitelist gebruiken. Of ze opschonen met bijvoorbeeld [php]pathinfo[/php]
<?php
$file = false;
$path = '/path/waar/de/bestanden/staan/';
if(isset(GET['file'])){
$file = pathinfo(GET['file'],PATHINFO_BASENAME);
if(!file_exists($path . $file)){
$file = false;
}
}
if($file !== false){
//doe iets met het bestand
}else{
//het bestand bestaat niet, doe iets zonder een bestand
}
?>
het voorbeeld is uiteraard niet compleet: een content header ontbreekt ook.

Liever nog dan de parameter file= mee te geven als get-parameter (in een rewrite trouwens)
zou ik gaan voor $_SERVER['REQUEST_URI'] om de aangesproken filename direct te kunnen oppakken.

Daarmee dwing je dan al af dat het om een file in die directory gaat.
Hey ik ben terug maar met nog een alternatief dat voor mij werkt... Omdat ik die apparte folders nog niet onder de knie heb.

wanneer mijn website lanceert gebruik ik een include global.php:
!code heb ik van dreamweaver laten genereren

<?php
if (!isset($_SESSION)) {
session_start();
}
$MM_authorizedUsers = "admin";
$MM_donotCheckaccess = "false";

// *** Restrict Access To Page: Grant or deny access to this page
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
// For security, start by assuming the visitor is NOT authorized.
$isValid = False;

// When a visitor has logged into this site, the Session variable MM_Username set equal to their username.
// Therefore, we know that a user is NOT logged in if that Session variable is blank.
if (!empty($UserName)) {
// Besides being logged in, you may restrict access to only certain users based on an ID established when they login.
// Parse the strings into arrays.
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
// Or, you may restrict access to only certain users based on their username.
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && false) {
$isValid = true;
}
}
return $isValid;
}

$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0)
$MM_referrer .= "?" . $_SERVER['QUERY_STRING'];
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
je wilt scripts afschermen?

Ik dacht aan pdf's, afbeeldingen en dergelijke...
.htaccess en .htpasswd?
@Edgar: Ik denk dat er een eigen login-systeem wordt bedoeld, en niet een tweede in de vorm van htaccess en htpasswd.
Wat ik bedoelde is dat ik af en toe wel eens scripts plaats in dezelfde directory. Maar dan zit ik even te denken, als mensen daar naar toe zouden surfen, dan zouden zij eventueel aan die inhoud kunnen :o dus ja, ik dacht, ik wil enkel toegang verlenen tot de bestanden die ik opgeef.

Reageren