【问题标题】:JavaScript Function Constructor Parse SecurityJavaScript 函数构造函数解析安全
【发布时间】: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


【解决方案1】:

应该很安全。 JSON 劫持正是由于这个原因而修复的错误。

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

【讨论】:

  • 太棒了。因此,只要我从未真正执行过它 (3) - 是否可以肯定地说解析本身 (2) 无法破坏任何全局变量? (当然,除非运行时/解析器实现中出现错误。)
  • @Steven 是的,确保不要执行它。解析是安全的。 (相比之下,用eval 解析它不同)。
  • 太好了,谢谢! (我没有足够的积分来投票:()
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 2021-09-24
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多