Verzeichnis mit Einschränkungen listing
-
01-10-2019 - |
Frage
Ich versuche, ein Skript zu machen, dass die Listen nur innerhalb eines Ordners Ordner. Die Sache ist, dass ich Benutzer, die Ordner in ihren Ordner erstellen kann also im Grunde, was ich versuche zu tun ist, einen Weg zu haben für die Benutzer ihre Ordner und Speichern von Dateien zu verwalten ... Mein Problem ist, dass ich php machen wollen " „denkt, dass der Stammordner ist ihr Home-Verzeichnis, und sie können nicht oberen als ihr Home-Verzeichnis gehen. Derzeit ist meine PHP-Funktion das nicht tun, es zeigt nur den Inhalt des Verzeichnisses ... und wenn der Benutzer geht eine Ebene nach oben und wieder eine Ebene nach oben ... und so weiter .... er konnte das gesamte Fest blättern Laufwerk ein.
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;
}
Lösung
anstelle dem Benutzer einen absoluten Pfad geben, damit ihnen nur Pfade spezifizieren, die zu einem gegebenen Basispfad relativ sind. Als nächstes schreibt eine Funktion, die jeder „/../“ für den relativen Pfad entfernt und Sie sind sicher (solange Benutzer keine Links auf dem Server erstellen können ...).
Wenn Sie nett sein wollen, können Sie vor, dass die „..“ mit dem Element entsprechen (so ‚a /../ b‘ würde ‚b‘ werden, das heißt die „..“ entfernen Sie das ‚a‘ ) oder ignorieren die „..“, wenn es, bevor es kein Pfad Element ist.
Andere Tipps
Hier ist ein wenig etwas zu erweitern auf:
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);
Für $folderPath
geben Sie in dem Ordner, von dem Sie die Verzeichnisse aufgelistet werden sollen. Für $homeFolder
Pässe im Ordner mögen Sie die obersten Ordner. Durch realpath
ing beiden Pfade Sie sicherstellen, dass sie absolute Pfade aufgelöst werden. Wenn die $folderPath
unter dem $homeFolder
ist, dann wird die $folderPath
Zeichenfolge mit starten und dem gesamten $homeFolder
String enthalten. Ist dies der Fall, wir haben nur glob
alle Verzeichnisse in der $folderPath
und zurück, um ihre absoluten Pfade in einem Array.
Um den relativen Pfad des $folderPath
vom $homeFolder
zu bekommen, nur das tun,
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
, die ./code/php/
zurückkehren würde.
Wenn Sie dies mit OOP tun möchten, können Sie interessiert sein in der SPL DirectoryIterator .