Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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
JavaScript函数构造函数解析安全性_Javascript_Function_Security_Input_Constructor - Fatal编程技术网

JavaScript函数构造函数解析安全性

JavaScript函数构造函数解析安全性,javascript,function,security,input,constructor,Javascript,Function,Security,Input,Constructor,在JavaScript中使用时,将根据给定代码动态创建函数对象: const input = 'return 2 + 3;'; // (1) const fun = new Function(input); // (2) const ret = fun(); // (3) 假设输入字符串(1)是任意用户输入,即使从未对其求值(3),解析该字符串(2),是否不安全 编辑: 我直接从用户输入(例如通过web)接收字符串(1)。它是完全未经过滤的,除了假设它是恶意的之

在JavaScript中使用时,将根据给定代码动态创建函数对象:

const input = 'return 2 + 3;';   // (1)
const fun = new Function(input); // (2)
const ret = fun();               // (3)
假设输入字符串(1)是任意用户输入,即使从未对其求值(3),解析该字符串(2),是否不安全

编辑:


我直接从用户输入(例如通过web)接收字符串(1)。它是完全未经过滤的,除了假设它是恶意的之外,我无法验证它。我可以在函数构造函数周围设置try/catch来防止解析时出现语法错误,但我特别感兴趣的是其他安全问题(破坏众所周知的全局变量,如中)。

这应该是非常安全的。JSON劫持是一个正是因为这个原因而修复的错误


解析它只会告诉您它在语法上是否有效,不会执行任何输入。但是,解析在性能方面可能代价高昂,因此如果攻击者控制输入,它可能会被用于DOS您的环境。

以什么方式“不安全”?如何确定字符串(1)是“恶意的”?我所说的不安全是指解析和传递这个对象(fun)会以某种方式影响程序的本地或全局状态。例如,通过修改著名的内置数组(如数组/对象)的构造函数/原型。在继续进行(2)期望的用户输入之前,您可以检查字符串是否为“恶意的”。请参阅问题Edj.Goice。所以,只要我从来没有真正执行过它(3)——可以安全地说,解析本身(2)没有办法破坏任何全局变量吗?(当然,除非运行时/解析器实现中有bug。)@Steven是的,请确保不要执行它。解析是安全的。(相比之下,与使用
eval
解析不同)。非常好,谢谢!(我没有足够的分数来投票:()