消除R中的字符串

时间:2013-07-21 07:34:29

标签: r security sanitization

这与上一个问题有关,此处为: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是一个问题,因为对于解析器,它们将与普通"和{{ 1}}。

这种方法是否有漏洞我错过了?

2 个答案:

答案 0 :(得分:4)

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

转义为:

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

双反斜杠被视为文字反斜杠,引用处于活动状态,代码被执行。

我也不知道R,但可能你至少可以使用原始控制字符(如换行或无效转义)导致崩溃。

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

答案 1 :(得分:0)

shQuote功能对您有用:

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