elenco di directory con restrizioni
-
01-10-2019 - |
Domanda
Sto cercando di fare uno script che elenca solo le cartelle all'interno di una cartella. La cosa è che ho gli utenti che possono creare cartelle all'interno delle loro cartelle quindi fondamentalmente quello che sto cercando di fare è di avere un modo per gli utenti di gestire i propri file e cartelle memorizzazione ... Il mio problema è che voglio fare php " pensare" che la cartella principale è la loro home directory e non può andare in alto di loro home directory. Attualmente la mia funzione php non lo fa, mostra solo il contenuto della directory ... e se l'utente passa di livello superiore e di nuovo di un livello ... e così via .... poteva sfogliare l'intero disco unità.
function directoryList($path) {
$dirStruct = array();
if(is_dir($path)) {
$handle = opendir($path);
while(($file = readdir($handle)) !== false) {
if(@opendir($path.$file)) {
chdir($path.$file);
$absolutepath = getcwd();
$dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
}
}
}
return $dirStruct;
}
Soluzione
Invece di dare all'utente un percorso assoluto, consentono solo loro di specificare percorsi che sono relativi ad un determinato percorso di base. Avanti, scrivere una funzione che rimuove qualsiasi "/../" per il percorso relativo e sei al sicuro (a patto che gli utenti non possono creare collegamenti sul server ...).
Se vuoi essere bello, si può abbinare la ".." con l'elemento prima che (in modo 'un /../ b' sarebbe diventato 'b', vale a dire la ".." rimuovere la 'a' ) o ignorare la ".." se non v'è alcun elemento del percorso prima di esso.
Altri suggerimenti
Ecco un piccolo qualcosa per espandere su:
function listFolders($folderPath, $homeFolder)
{
$folderPath = realpath($folderPath);
$homeFolder = realpath($homeFolder);
if(strpos($folderPath, $homeFolder) === 0) {
return glob("$folderPath/*", GLOB_ONLYDIR);
}
}
$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);
Per $folderPath
si passa nella cartella che si desidera elencare le directory da. Per passaggio $homeFolder
nella cartella che si desidera essere il più cartella principale. Con realpath
ing entrambi i percorsi è assicurarsi che si risolvono a percorsi assoluti. Se il $folderPath
è inferiore al $homeFolder
, quindi la stringa $folderPath
inizierà con e contiene l'intera stringa $homeFolder
. Se questo è il caso, abbiamo appena glob
tutte le directory nel $folderPath
e restituire loro sentieri assoluti in un array.
Per ottenere il percorso relativo del $folderPath
dal $homeFolder
, basta fare
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
, che sarebbe tornato ./code/php/
.
Se si vuole fare questo con OOP, si potrebbe essere interessato al SPL DirectoryIterator .