7

这与上一个问题有关,这里是:Converting a \u escaped Unicode string to ASCII

我提出了一个涉及 的解决方案eval(parse(text=x)),对于非 R 用户,这意味着它所说的:解析文本字符串,然后评估它。目的不是允许执行任意代码,而只是取消转义转义的 Unicode 文本。因此解决方案:

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

虽然考虑到有限的目标,这应该是相当安全的,但我很想知道:需要多少消毒才能保证安全?

至少,我猜任何嵌入的单引号和双引号都必须转义。例如,假设我们有

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

然后eval按照上面的代码片段执行此操作将执行中间的代码。所以我们必须转义引号:

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

同样对于双引号。我不认为未转义的Unicode 等价物\u0022\u0027是一个问题,因为对于解析器来说,它们与普通的"'.

我错过了这种方法中的任何漏洞吗?

4

2 回答 2

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

被转义到:

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

双反斜杠被评估为文字反斜杠,引号是活动的,代码被执行。

另外我不了解 R,但您可能至少会使用原始控制字符(如换行符或无效转义符)导致崩溃。

eval总的来说是一个杯子的游戏。正常的字符串处理(搜索字符串以查找您想要的序列,将其替换)是更好的方法,并且最好使用现有的库来处理特定的正确指定的格式。例如,如果您有 JSON,请使用 JSON 解析器。有许多可能使用\u转义的字符串文字格式,所有的规则都略有不同,因此您需要正确选择确切的格式。

于 2013-07-21T11:19:12.787 回答
0

shQuote可以为您工作的功能:

eval(parse(text=shQuote(x)))
# [1] "this is a '; print(dir()); 'string"
于 2014-04-23T20:53:47.920 回答