2010-01-25 2 views
0

J'écris une fonction PHP qui supprimera tous les fichiers dans le répertoire qui est passé à (et éventuellement, peut-être étendre à une suppression récursive). Pour être sûr, je veux faire en sorte que, par un bug ou quelque chose, je ne cherche pas à supprimer quoi que ce soit si le répertoire est passé dans le répertoire racine.Reconnaissant le répertoire racine en PHP

autorisations de fichiers doivent me protéger dans une large mesure, mais juste au cas où, et surtout si j'élargissons à un récursive supprimer, je veux juste prendre cette étape supplémentaire.

En tant que facteur de complication, ce code peut être exécuté dans une machine Windows ou une machine Linux, de sorte que le répertoire racine peut ressembler à « C: \ » ou «/». Je suppose qu'il y a d'autres façons de faire référence à la racine, peut-être 'c: \ temp ..'

Donc, existe-t-il un moyen fiable en PHP de reconnaître qu'une dir rép se résout à la racine du fichier? système?

Elaboration ...

J'écris des tests PHPUnit pour une application web et je suis en train de créer un cadre dans lequel l'état de l'application est sauvegardé avant que les tests sont exécutés et restaurés par la suite. L'application permet aux utilisateurs de télécharger des fichiers. Selon le fichier, il est copié dans l'un des répertoires possibles.

Pour enregistrer et restaurer l'état de l'application de ces répertoires doivent être copiés quelque part, l'exécution des tests, puis les répertoires doivent avoir leurs fichiers supprimés et retreived de la sauvegarde.

L'emplacement de ces répertoires peuvent varier d'une machine à une autre, et je sais que certaines personnes les ont mis en dehors de l'application Web. Il y a un fichier de configuration qui peut être lu par le test qui donne l'emplacement de ces répertoires pour la machine donnée.

Si je ne limiterai pas tous ces répertoires à un arbre dir spécifique, il est difficile de faire l'emprisonnement. Si je restreins ces répertoires à un répertoire spécifique, certaines personnes devront reconfigurer leurs machines.

Répondre

3

Vous devriez avoir un dossier racine défini, que vous n'allez au-dessus, emprisonnant a.k.a.. Le dossier racine n'est pas le seul dossier où de graves dommages peuvent être causés.

Modifier.

Bien que je préconise toujours utiliser une sorte d'emprisonnement, je suppose que vous pouvez reconnaître le dossier racine en dépouillant sur les drive-lettres et traduire \ à /. Le dossier racine serait alors toujours un seul /.

function isRootFolder($dirpath) { 
    list($drive, $path) = explode(':', str_replace('\\', '/', $dirpath), 2); 

    return $path == '/'; 
} 
+0

J'ai réfléchi à cela et j'aime ce terme, "jailing". Je pense que sur certains systèmes Windows, je dois tenir compte des répertoires dans le compte des utilisateurs, c: \ users \ ... ainsi que des répertoires dans l'application web, c: \ wamp \ www \ ... il serait donc difficile d'emprisonner . Peut-être cela vaut-il la peine de reconfigurer le système pour que tous les répertoires affectés soient sous c: \ wamp \ ... L'autre chose est, bien que je sois d'accord qu'il existe d'autres répertoires où je ne voudrais pas supprimer accidentellement tous les fichiers, root est le seul celui que je pense qu'un bug serait susceptible de générer. –

+0

Voulez-vous préciser ce que vous essayez d'accomplir exactement? Je pourrais, ou quelqu'un d'autre, être en mesure de vous donner une réponse plus utile. –

+0

Élaboration ci-dessus –

0

Essayez, cette fonction:

function is_root_dir($path) 
{ 
    $clean_path = realpath($path); 
    if($clean_path == '/' || preg_match('/[a-z]:\\/i', $clean_path)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Il est non testé, je viens d'écrire dans l'éditeur ici. realpath() résout le chemin, en suivant des liens simboliques et en résolvant des choses comme: c: \ temp .. == c: \

Editer: Finalement, vous devriez suivre les conseils donnés par nikc, définir une liste de répertoires qui sont sûrs à supprimer.

0

J'utilise ceci:

if (dirname($target)==$target) { // you're at the root dir 

(est portable entre Microsoft et tout le reste)

C.

Questions connexes