unescape strings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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?
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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?
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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
äöüß

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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,
Antworten