listado del directorio con restricciones
-
01-10-2019 - |
Pregunta
Estoy tratando de hacer un script que las listas sólo las carpetas dentro de una carpeta. La cosa es que tengo usuarios que pueden crear carpetas dentro de sus carpetas así que básicamente lo que estoy tratando de hacer es tener una forma para que los usuarios administrar sus carpetas y archivos que almacenan ... Mi problema es que quiero hacer php " pensar" que la carpeta raíz es su directorio personal y no puede ir superior de su directorio personal. Actualmente mi función de php no hace eso, sólo muestra el contenido del directorio ... y si el usuario pasa a un nivel superior y otra vez a un nivel superior ... y así sucesivamente .... podía ver todo el disco unidad.
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;
}
Solución
En lugar de dar al usuario una ruta absoluta, solamente les permiten especificar las rutas que son relativas a una ruta de base dada. A continuación, escribir una función que permite eliminar el "/../" para la ruta relativa y que está a salvo (siempre que los usuarios no pueden crear enlaces en el servidor ...).
Si quieres ser agradable, que puede coincidir con el ".." con el elemento antes de que (por lo que 'un /../ b' se convertiría en 'b', es decir, el ".." eliminar 'a' ) o ignorar el ".." si no hay un elemento de la ruta antes de ella.
Otros consejos
Aquí hay un poco de algo para expandir en:
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);
Para $folderPath
se pasa en la carpeta que desea listar los directorios de. Para pase $homeFolder
en la carpeta que desea ser el más carpeta superior. Por realpath
ing ambos caminos se asegure de que se resuelven a rutas absolutas. Si el $folderPath
está por debajo del $homeFolder
, entonces la cadena $folderPath
va a comenzar y contiene toda la cadena $homeFolder
. Si este es el caso, sólo glob
todos los directorios en la $folderPath
y devolver sus pathes absolutos en una matriz.
Para obtener la ruta relativa de la $folderPath
del $homeFolder
, acaba de hacer
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
que volver ./code/php/
.
Si usted quiere hacer esto con programación orientada a objetos, que podría estar interesado en el SPL DirectoryIterator .