2013-07-21 13 views
6

Dies wird auf eine frühere Anfrage bezogen, hier: Converting a \u escaped Unicode string to ASCIISanitizing Strings in R

ich eine Lösung vorgeschlagene Beteiligung eval(parse(text=x)), die für Nicht-R Anwender bedeutet, was es sagt: die Textzeichenfolge Parsen, Auswerten es dann. Das Ziel war nicht zu erlauben, dass willkürlicher Code ausgeführt wird, aber entkomme nur entkommenen Unicodetext. Daraus ergibt sich die Lösung:

eval(parse(text=paste0("'", x, "'"))) 

Während dies ziemlich sicher das eingeschränkte Ziel gegeben sein sollte, würde ich gerne wissen: Wie viel sanitisation erforderlich ist, Dinge zu verwahren?

Zumindest denke ich, dass alle eingebetteten einfachen und doppelten Anführungszeichen maskiert werden müssen. Angenommen, wir

x <- "this is a '; print(dir()); 'string" 

Dann eval ‚ing dies pro Snippet oben würde den Code in der Mitte ausführen müssen. Also müssen wir den Anführungszeichen entkommen:

eval(parse(text=paste0("'", 
         gsub("'", "\\\\'", x), 
         "'"))) 

Und ähnlich für doppelte Anführungszeichen. Ich glaube nicht, dass die unescaped Unicode-Entsprechungen \u0022 und \u0027 ein Problem sind, da sie für den Parser identisch mit Plain " und ' sind.

Gibt es Löcher in diesem Ansatz, die ich verpasst habe?

+0

Es wäre gut, wenn es ein Weg zu entkommen Strings zu analysieren, ohne die Maschinen (und Risiko) von 'eval'! – seancarmody

+0

Ich habe eine Alternative ohne 'eval' gefunden: http://Stackoverflow.com/a/17771985/1543437 – seancarmody

Antwort

4
this is a \'; print(dir()); 'string 

ist entgangen:

'this is a \\'; print(dir()); 'string' 

Doppelbackslash als Backslash EVALED wird, Zitat aktiv ist, wird der Code ausgeführt.

Auch ich weiß nicht über R, aber wahrscheinlich könnten Sie zumindest einen Absturz mit rohen Steuerzeichen wie Newline oder ungültige Escapes verursachen.

eval ist ein Becher Spiel im Allgemeinen. Die normale Verarbeitung von Zeichenfolgen (Suchzeichenfolge für die gewünschte Sequenz, Ersetzen derselben) ist der bessere Ansatz, und die Verwendung einer vorhandenen Bibliothek für ein bestimmtes korrekt angegebenes Format ist das Beste. Wenn Sie beispielsweise JSON verwenden, verwenden Sie einen JSON-Parser. Es gibt viele mögliche String-Literal-Formate, die \u Escape-Zeichen verwenden, alle mit etwas anderen Regeln, so dass Sie das genaue Format korrekt auswählen möchten.

+0

Eigentlich wird der Parser einen Fehler bei dieser Eingabe geben, so dass der gesamte Ausdruck (einschließlich des eingebetteten Codes) wird nie bewertet werden. Aber das ist auch nicht sehr gut .... –

0

Es gibt shQuote Funktion, die für Sie arbeiten könnte:

eval(parse(text=shQuote(x))) 
# [1] "this is a '; print(dir()); 'string"