IS_DIR () est l'une des fonctions intégrées de PHP, qui est utilisée pour déterminer si un chemin est un répertoire existant:
<code> $ path = '/ var / www / html / uploads'; if (is_dir ($ path)) {echo "Ceci est un répertoire valide"; } else {echo "Ce chemin n'est pas un répertoire ou n'existe pas"; } </code>Cette fonction renvoie une valeur booléenne True ou False en fonction de l'état du système de fichiers réel sur le serveur.
Essayez d'utiliser des chemins absolus lorsque l'appel est_dir () . Le chemin relatif peut échouer en raison des modifications du répertoire de travail actuel (CWD). Par exemple:
<code> $ relativePath = 'images'; $ Absolutepath = __dir__. «/ images»; if (is_dir ($ Absolutepath)) {
// Méthode recommandée
}
</code>
RealPath () peut normaliser le chemin, supprimer les composants de chemin relatif tels que ../ , et également identifier les liens souples. Combiné avec IS_DIR () , la vérification du chemin peut être effectuée plus efficacement:
<code> $ path = realPath ('/ var / www / html / uploads'); if ($ path! == false && is_dir ($ path)) {// assurez-vous que le chemin existe et est un répertoire} </code>Lorsque vous obtenez des chemins à partir de l'entrée de l'utilisateur, assurez-vous de filtrer les caractères dangereux tels que ... pour éviter les attaques de traversée du répertoire. Il peut être combiné avec des expressions régulières ou des mécanismes de liste blanche:
<code> $ input = $ _get ['dir'] ?? ''; if (preg_match ('/ ^ [a-za-z0-9 _ \ - \ /] + $ /', $ input)) {$ path = realPath ('/ var / www / html /'. $ input); if ($ path! == false && is_dir ($ path)) {// Secure Access}} </code>Bien que IS_DIR () renvoie False pour les chemins inexistants, si vous avez besoin d'une logique d'inspection plus rigoureuse, vous pouvez d'abord utiliser File_exists () pour porter un jugement:
<code> $ path = '/ var / www / html / uploads'; if (file_exists ($ path) && is_dir ($ path)) {// Vérification plus stricte} </code>Les liens de symbole peuvent faire en sorte que IS_DIR () se comporte différemment que prévu. Par exemple, si un lien pointe vers un répertoire qui n'existe pas, IS_DIR () renvoie également False. Vous pouvez utiliser is_link () en conjonction avec:
<code> $ path = '/ var / www / html / uploads'; if (is_link ($ path)) {echo "Ceci est un lien symbolique"; } elseif (is_dir ($ path)) {echo "Ceci est un vrai répertoire"; } </code>Problème des autorisations : même si le répertoire existe, IS_DIR () peut renvoyer False si PHP n'a pas de permis de lecture.
Problèmes de performances : les appels fréquents à IS_DIR () pour vérifier un grand nombre de chemins peuvent entraîner une pression d'E / S, et il est recommandé de mettre en cache des chemins vérifiés.
Compatibilité multiplateforme : les séparateurs de chemin sont différents sur Windows et Linux, et il est recommandé d'utiliser Directory_Separator ou Utilisation / Utilisation / .
$realBase = realpath($baseDir);
if ($realBase === false || !is_dir($realBase)) {
return $dirs;
}
$entries = scandir($realBase);
foreach ($entries as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $realBase . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$dirs[] = $entry;
}
}
return $dirs;
}
$ uploadDirs = listUploadDirs ('/ var / www / gitbox.net / uploads');
print_r ($ uploadDirs);
</code>
Ce code répertorie toutes les sous-répertoires dans le répertoire spécifié et prend en compte la normalisation du chemin et le traitement de base de la sécurité.