2011-02-27 6 views
0

사용자 제공 입력을 파일 이름으로 변환해야하는 IRCXMPP 봇을 프로그래밍 중입니다. 나는 이것을하기위한 함수를 이미 작성했다. 충분히 맑은가요?Python의 userinput에서 파일 이름 저장하기

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 

그것은 파일 이름 Google App Engine 호환되도록 별도의 제어 문자를 제거하고 os.sep 대체하는 코드뿐만 아니라 일부 repaces와 화이트리스트가있다 : 여기

는 코드입니다.

문제의 로봇은 http://jsonbot.googlecode.com입니다.

그래서 어떻게 생각하십니까?

+2

? 항상 올바른 디렉토리에 저장하십시오. 또한 파일이 이미 있으면 어떻게됩니까? – Patrick

+0

특히, Windows에서'os.sep'는 \이지만/또한 구분 기호로 사용됩니다. –

+0

변환의 요점은 무엇입니까? 독창성이 필요합니까? 검색 가능성? 코드에서 충돌이 발생할 수 있으며 피할 것인지 여부는 분명하지 않습니다. –

답변

0

urllib.quote(name.encode("utf8"))도 사람이 읽을 수있는 것으로 만들어 지므로 안전해야합니다. 예 :

사용자가 '파일 이름으로 ../../../../ fubar`을 제공하면 어떻게됩니까
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 요구 사항 : - 글자, 숫자, _, +, /, $,. 및 - 만 포함해야합니다. – jsonbot

+0

나는이 솔루션을 좋아하지만 ... 만약 내가 그다지 App Engine을 다루지 않았다면 나는 그것을 사용했을 것이다. 그러나 내가 쉘 봇 파일을 App Engine에 업로드해야한다면 파일 이름을 확인하고 싶습니다. – jsonbot

0

사람이 읽을 수있는 파일 이름을 원하지 않으면 항상 base64.urlsafe_b64encode(name)을 수행하는 것으로 생각하면 안전한 이름이됩니다. 그렇지 않으면 가장자리 케이스의 수는 꽤 길며, 그 중 하나를 잊어 버리면 보안 문제가 발생합니다.

+0

나는 사람이 읽을 수있는 파일 이름이 필요합니다. 파일은 로봇에 의해 생성되지만 필요할 경우 사람이 편집 할 수있는 jsonstrings입니다. 사용자가 올바른 구성 파일을 편집 할 수 있어야하므로 봇 이름이 중요한 곳에서 봇의 구성 파일을 생각해보십시오. – jsonbot

관련 문제