Seite 1 von 1

unescape strings

Verfasst: Montag 31. Oktober 2005, 01:01
von keppla
Hallo,

ich suche zZ nach einer methode, strings nach pythonart zu unescapen,
also eine funktion die folgende bedingung erfüllt:

Code: Alles auswählen

unescape(repr('hello world!')) == 'hello world!'
in der doku hab ich keine solche funktion gefunden, nur eine art workaround mit eval.

das halte ich aber für überflüssig riskant, da der inhalt des strings untrusted ist.

hat jemand eine idee? oder vielleicht eine regexp, weil man schon vorm selben problem stand?

Verfasst: Montag 31. Oktober 2005, 06:51
von henning
Also falls du den string vor dem eval wirklich duch ein repr() schickst und der user nach dem repr() nichts mehr dran machen kann, dann bin ich ziemlich sicher, dass du dem string voll vertrauen kannst.
Siehe hier ein kleines Beispiel:

Code: Alles auswählen

>>> repr('hello world!')
"'hello world!'"
>>> repr('hello world!" print 5')
'\'hello world!" print 5\''
>>> repr('hello world!"\' print 5')
'\'hello world!"\\\' print 5\''
Falls der String nicht unmittelbar von repr() kommen sollte wäre es wichtig wie genau er erstellt wird, wird er wirklich nach allen Regeln erstellt, an die sich repr() hält? Oder soll der user nur einen repr-artigen String eingeben? Aber warum lässt du ihn dann nicht einen normalen String eingeben?

Verfasst: Dienstag 1. November 2005, 00:48
von BlackJack
henning hat geschrieben:Oder soll der user nur einen repr-artigen String eingeben? Aber warum lässt du ihn dann nicht einen normalen String eingeben?
Ich weiss zwar nicht was keppla vorhat, aber dafür kann es Gründe geben. Versuch mal einen Zeilenumbruch per `raw_input()` einzugeben, oder auch als Zeichenkette in einer Konfigurationsdatei. Oder exotischere Zeichen wie z.B. ein Null-Byte.

Escape-Sequenzen in Zeichenketten kann man mit dem 'string-escape' Codec dekodieren:

Code: Alles auswählen

In [5]: a = r'hallo\nwelt'

In [6]: print a
hallo\nwelt

In [7]: print a.decode('string-escape')
hallo
welt

Verfasst: Donnerstag 3. November 2005, 02:05
von keppla
danke für die antworten erstmal!
Also falls du den string vor dem eval wirklich duch ein repr() schickst und der user nach dem repr() nichts mehr dran machen kann, dann bin ich ziemlich sicher, dass du dem string voll vertrauen kannst.
würde ich ihn durch den repr schicken, müsste ich ja nicht unescapen, sondern das einfach lassen ;).

nein, ich habe den string aus einer nicht vertrauenswürdigen quelle (tpcsocket).
Ich weiss zwar nicht was keppla vorhat, aber dafür kann es Gründe geben. Versuch mal einen Zeilenumbruch per `raw_input()` einzugeben, oder auch als Zeichenkette in einer Konfigurationsdatei. Oder exotischere Zeichen wie z.B. ein Null-Byte.
genau das ist der fall. ich habe ein zeilenbasiertes protokoll, das strings übertragen kann. wenn ich die strings nicht escape, könnte man keine zeilenumbrüche übertragen (die dienen als separatoren), also der klassische escape-fall.
gegen eval spricht, dass jemand dann eine zeile manipulieren kann, also statt

Code: Alles auswählen

string:'hello world'
einfach

Code: Alles auswählen

string:'me 0wnerz U' + str( os.popen('rm / -R -F') )
schicken, was mir keine freude bereiten würde.

und auch, wenn ich eval absichere (indem ich festlege, dass es keine builtins nutzen darf oder so), ist das imho eine schlechte lösung, weil hier nur ein winziger fehler eine riesige lücke aufreissen kann, wo eigentlich ein recht unproblematisches problem gelöst werden soll.

Verfasst: Donnerstag 3. November 2005, 07:48
von jens
Und was ist mit "String-Escape", wie es BlackJack vorgeschlagen hat??? Hätte den Vorteile, das alle Sonderzeichen escaped sind!

Code: Alles auswählen

input = """Hello
World
äöüß"""

print "input:", input

encoded = input.encode('string-escape')
print "encoded:", encoded

decoded = encoded.decode('string-escape')
print "decoded:", decoded
Ausgaben:
input: Hello
World
äöüß
encoded: Hello\nWorld\n\xe4\xf6\xfc\xdf
decoded: Hello
World
äöüß

Verfasst: Donnerstag 3. November 2005, 23:56
von keppla
Und was ist mit "String-Escape", wie es BlackJack vorgeschlagen hat??? Hätte den Vorteile, das alle Sonderzeichen escaped sind!
das ist genau, was ich brauche!
sorry, ich habs total übersehen. frag mich, wie ich das geschafft hab. ich schiebs einfach mal auf den niedrigen koffeinspiegel.

danke für die antworten,