消除R中的字符串

Hon*_*Ooi 6 security sanitization r

这与之前的问题有关,此处:将\ u转义的Unicode字符串转换为ASCII

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

eval(parse(text=paste0("'", x, "'")))
Run Code Online (Sandbox Code Playgroud)

虽然考虑到有限的目标,这应该是相当安全的,但我有兴趣知道:保持安全需要多少卫生处理?

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

x <- "this is a '; print(dir()); 'string"
Run Code Online (Sandbox Code Playgroud)

然后eval根据上面的代码段执行此操作将执行中间的代码.所以我们必须逃避报价:

eval(parse(text=paste0("'",
                       gsub("'", "\\\\'", x),
                       "'")))
Run Code Online (Sandbox Code Playgroud)

同样适用于双引号.我不认为未转义的 Unicode等价物\u0022并且\u0027是一个问题,因为对于解析器,它们将与plain "'.

我错过了这种方法有什么漏洞吗?

bob*_*nce 5

this is a \'; print(dir()); 'string
Run Code Online (Sandbox Code Playgroud)

被转义为:

'this is a \\'; print(dir()); 'string'
Run Code Online (Sandbox Code Playgroud)

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

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

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