【发布时间】:2018-01-25 06:41:02
【问题描述】:
在 JavaScript 中使用 Function constructor 时,会根据给定代码动态创建函数对象:
const input = 'return 2 + 3;'; // (1)
const fun = new Function(input); // (2)
const ret = fun(); // (3)
假设输入字符串(1)是任意用户输入,解析它是否不安全(2),即使它从未被评估过(3 )?
编辑:
我直接从用户输入接收字符串 (1),例如通过网络。它完全未经过滤,除了假设它是恶意的之外,我无法验证它。我可以在 Function 构造函数周围放置一个 try/catch 以防止解析时出现语法错误,但我对其他安全问题特别感兴趣(修改众所周知的全局变量,例如在 https://haacked.com/archive/2009/06/25/json-hijacking.aspx/ 中)。
【问题讨论】:
-
“不安全”以什么方式?如何确定字符串 (1) 是“恶意的”?
-
不安全是指这个对象的解析和传递(有趣)会以某种方式影响我程序的本地或全局状态。例如,通过修改数组/对象等知名内置函数的构造函数/原型。
-
您可以在继续(2)之前检查您认为是“恶意”的字符串
-
预期的用户输入是什么?
-
请查看问题编辑。
标签: javascript function security input constructor