这与上一个问题有关,这里是:Converting a \u escaped Unicode string to ASCII
我提出了一个涉及eval(parse(text=x))
的解决方案,对于非 R 用户,这意味着它所说的:解析文本字符串,然后评估它。目的不是允许执行任意代码,而只是取消转义转义的 Unicode 文本。因此解决方案:
eval(parse(text=paste0("'", x, "'")))
虽然考虑到受限制的目标,这应该是相当安全的,但我很想知道:需要多少 sanitizer 才能保证安全?
至少,我猜任何嵌入的单引号和双引号都必须转义。例如,假设我们有
x <- "this is a '; print(dir()); 'string"
然后
eval
根据上面的代码片段执行此操作将在中间执行代码。所以我们必须转义引号:eval(parse(text=paste0("'",
gsub("'", "\\\\'", x),
"'")))
双引号也类似。我不认为未转义的 Unicode 等效项
\u0022
和 \u0027
是一个问题,因为对于解析器它们将与普通 "
相同和 '
.这种方法有没有我错过的漏洞?
最佳答案
this is a \'; print(dir()); 'string
被转义为:
'this is a \\'; print(dir()); 'string'
双反斜杠被评估为文字反斜杠,引号处于事件状态,代码被执行。
此外,我不了解 R,但您可能至少可以使用原始控制字符(如换行符或无效转义符)导致崩溃。
eval
一般是杯子的游戏。正常的字符串处理(搜索您想要的序列的字符串,替换它)是更好的方法,并且使用现有的库来处理特定的正确指定的格式是最好的。例如,如果您有 JSON,请使用 JSON 解析器。有许多可能的字符串文字格式使用 \u
转义,所有规则都略有不同,因此您需要正确选择确切的格式。
关于r - 清理 R 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770093/