【问题标题】:Create save filenames from userinput in Python从 Python 中的用户输入创建保存文件名
【发布时间】:2011-02-27 12:27:01
【问题描述】:

我正在编写一个需要将用户提供的输入转换为文件名的 IRCXMPP 机器人。我已经写了一个函数来做到这一点。够理智吗?

代码如下:

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

这是一个白名单,带有额外的代码来删除控制字符并替换 os.sep,以及一些替换以使文件名 Google App Engine 兼容。

有问题的机器人位于http://jsonbot.googlecode.com

那你怎么看?

【问题讨论】:

  • 如果用户将../../../../fubar 作为文件名会发生什么?确保始终保存到正确的目录。另外,如果文件已经存在怎么办?
  • 特别是在 Windows 上,os.sep 是 \,但 / 也可以用作分隔符。
  • 您能解释一下转换的意义何在吗?你需要独特性吗?可回收性?在您的代码中可能存在冲突,您是否要避免它们尚不清楚。
  • 我知道这个字符串 concat 的比较,我会用它来让机器人使用更少的内存,因为它使用了很多字符串;] 现在我专注于让它保存..
  • 我不知道/也曾在 Windows 上用作分隔符,我会考虑到这一点;]

标签: python xmpp user-input filenames irc


【解决方案1】:

urllib.quote(name.encode("utf8")) 将产生人类可读的东西,这也应该是安全的。示例:

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

【讨论】:

  • google 对文件名的要求:- 只能包含字母、数字、_、+、/、$、. 和 -。
  • 我喜欢这个解决方案……如果我不必处理 App Engine,那么我会使用它。但是,如果我需要将我的 shell bot 文件上传到 App Engine,我希望文件名正常。
【解决方案2】:

您可能会考虑只使用base64.urlsafe_b64encode(name),这将始终产生一个安全的名称,除非您真的想要一个人类可读的文件名。否则,边缘情况的数量会很长,如果您忘记其中一个,就会出现安全问题。

【讨论】:

  • 我确实需要文件名是人类可读的。文件是由机器人生成的 jsonstrings,但如果需要,必须是人类可编辑的。想想机器人的配置文件,其中机器人名称很重要,因为用户必须能够编辑正确的配置文件。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多