这与上一个问题有关,此处为: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}}。
这种方法是否有漏洞我错过了?
答案 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"