R中的消毒字符串
这与前面的一个问题有关,如下所示: 我提出了一个涉及R中的消毒字符串,r,security,sanitization,R,Security,Sanitization,这与前面的一个问题有关,如下所示: 我提出了一个涉及eval(parse(text=x))的解决方案,对于非R用户,它的意思是:解析文本字符串,然后对其进行评估。其目的不是允许执行任意代码,而只是取消转义Unicode文本。因此,解决方案是: eval(parse(text=paste0("'", x, "'"))) 考虑到有限的目标,这应该是相当安全的,但我想知道:需要多少消毒才能保证安全 至少,我想任何嵌入的单引号和双引号都必须转义。例如,假设我们有 x <- "this is a
eval(parse(text=x))
的解决方案,对于非R用户,它的意思是:解析文本字符串,然后对其进行评估。其目的不是允许执行任意代码,而只是取消转义Unicode文本。因此,解决方案是:
eval(parse(text=paste0("'", x, "'")))
考虑到有限的目标,这应该是相当安全的,但我想知道:需要多少消毒才能保证安全
至少,我想任何嵌入的单引号和双引号都必须转义。例如,假设我们有
x <- "this is a '; print(dir()); 'string"
同样的,双引号。我不认为未替换的Unicode等价物\u0022
和\u0027
是一个问题,因为对于解析器来说,它们将与普通的“
和”相同
这种方法有没有我遗漏的漏洞
this is a \'; print(dir()); 'string
转义到:
'this is a \\'; print(dir()); 'string'
双反斜杠作为文字反斜杠求值,引号处于活动状态,代码被执行
另外,我不知道R,但可能至少可以使用原始控制字符(如换行符或无效转义符)导致崩溃
eval
通常是马克杯游戏。正常的字符串处理(搜索所需序列的字符串,替换它)是更好的方法,对特定的正确指定格式使用现有库是最好的方法。例如,如果您有JSON,请使用JSON解析器。有许多可能的字符串文字格式使用\u
转义,所有这些格式都有稍微不同的规则,因此您需要正确选择确切的格式。有可能适合您的功能:
eval(parse(text=shQuote(x)))
# [1] "this is a '; print(dir()); 'string"
如果有一种方法可以在没有eval
机制(和风险)的情况下解析转义字符串,那就太好了!我已经想出了一种没有eval
的替代方法:实际上,解析器会在该输入上给出一个错误,因此整个表达式(包括嵌入的代码)将永远不会被计算。但这也不是很好。。。。
eval(parse(text=shQuote(x)))
# [1] "this is a '; print(dir()); 'string"