2011-02-27 3 views
0

Je suis en train de programmer un bot IRC et XMPP qui doit convertir l'entrée fournie par l'utilisateur en un nom de fichier. J'ai déjà écrit une fonction pour le faire. Est-ce assez sain d'esprit?Créer des noms de fichiers à partir de userinput en Python

Voici le code:

allowednamechars = string.ascii_letters + string.digits + '_+/$.-' 

def stripname(name, allowed=""): 
    """ strip all not allowed chars from name. """ 
    n = name.replace(os.sep, '+') 
    n = n.replace("@", '+') 
    n = n.replace("#", '-') 
    n = n.replace("!", '.') 
    res = u"" 
    for c in n: 
     if ord(c) < 31: continue 
     elif c in allowednamechars + allowed: res += c 
     else: res += "-" + str(ord(c)) 
    return res 

Il est un whitelist avec le code supplémentaire pour supprimer les caractères de contrôle et de remplacer os.sep, ainsi que quelques repaces pour rendre le nom de fichier Google App Engine compatible.

Le bot en question est au http://jsonbot.googlecode.com.

Alors, qu'en pensez-vous?

+2

Que se passe-t-il si un utilisateur donne '../../../../ fubar' comme nom de fichier? Assurez-vous de toujours sauvegarder dans le bon répertoire. Aussi, que se passe-t-il si le fichier existe déjà? – Patrick

+0

En particulier, sur Windows 'os.sep' est \, mais/fonctionne aussi comme séparateur. –

+0

Pouvez-vous expliquer quel est le point de la conversion? Avez-vous besoin d'unicité? Récupérabilité? Dans votre code, il peut y avoir des collisions, et il n'est pas clair si vous voulez les éviter ou non. –

Répondre

0

urllib.quote(name.encode("utf8")) produira quelque chose de lisible par l'homme, qui devrait également être sûr. Exemple:

In [1]: urllib.quote(u"foo bar$=+:;../..(boo)\u00c5".encode('utf8')) 
Out[1]: 'foo%20bar%24%3D%2B%3A%3B../..%28boo%29%C3%85' 
+0

google les exigences sur les noms de fichiers: - Il doit contenir uniquement des lettres, des chiffres, _, +, /, $,., Et -. – jsonbot

+0

j'aime cette solution si ... si je n'ai pas eu à traiter avec App Engine alors je l'aurais utilisé. Mais si jamais j'ai besoin de télécharger mes fichiers de bot shell sur App Engine, je veux que les noms de fichiers soient corrects. – jsonbot

0

Vous pourriez envisager de faire base64.urlsafe_b64encode(name), qui produira toujours un nom sûr, sauf si vous voulez vraiment un nom de fichier lisible par l'homme. Sinon, le nombre de cas de bordure est assez long, et si vous oubliez l'un d'entre eux, vous avez un problème de sécurité.

+0

J'ai besoin que le nom de fichier soit lisible par l'homme .. les fichiers sont des jsonstrings qui sont générés par le bot mais doivent être éditables par l'homme si nécessaire. Pensez aux fichiers de configuration d'un bot dans lesquels le nom du bot est important car l'utilisateur doit pouvoir éditer le bon fichier de configuration. – jsonbot

Questions connexes