2017-07-05 4 views
0

J'essaie de vérifier si une chaîne fournie par l'utilisateur est un simple nom de fichier/dossier. Je prévois d'utiliser os.path.join() pour concaténer ce nom à un répertoire racine prédéfini, mais je souhaite détecter et interdire les chemins qui tentent de traverser n'importe où en dehors de ce répertoire racine. Par exemple, une chaîne avec la valeur 'track001.mp3' serait bien, elle se résoudrait à 'rép_racine/piste001.mp3'. Cependant, ceux-ci doivent être détectés et interdits:Existe-t-il un moyen bien défini de vérifier si un chemin est un simple nom de fichier/dossier en Python?

'../other_root_dir/' 
'/etc' 
'/' 
'~' 
'subdir/inner_file' 
+0

Vous pouvez utiliser 'os.path.listdir' pour lister tout ce qui est acceptable et vérifier par recoupement ou n'ai-je pas compris votre question? – PYA

+0

Pourquoi "~" serait-il inacceptable? C'est seulement un métacaractère quand il n'est pas cité dans le shell; c'est un tilde littéral ailleurs. – duskwuff

Répondre

1

Je vous conseille de créer la chaîne de chemin comme vous le feriez normalement en supposant que l'utilisateur se comporte (en passant par exemple un « simple » ou conforme nom de chemin). Ensuite, j'utiliserais os.path.expandvars et os.path.normpath pour obtenir le nom de chemin réel. Enfin, je vérifierai que le nom du chemin d'accès actuel réside dans le répertoire racine. Quelque chose comme:

from os.path import expandvars, normpath, join 

ROOT_DIR = 'root_dir' 

user_path = 'some_path' 
test_path = normpath(expandvars(join(ROOT_DIR, user_path))) 

expected_prefix = normpath(ROOT_DIR) 
if not test_path.startswith(expected_prefix): 
    raise ValueError(f'Invalid path "{user_path}"') # python3.6 f-string.