Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的消毒字符串_R_Security_Sanitization - Fatal编程技术网

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"