【问题标题】:How secure or insecure is this JavaScript code if run on the server (nodeJS)?如果在服务器 (nodeJS) 上运行,这段 JavaScript 代码有多安全或不安全?
【发布时间】:2015-06-01 18:37:12
【问题描述】:

很好奇如果在服务器上执行这种类型的代码可能会出现什么不可预见的问题。或者如果有任何非eval 替代品。

var a = {b:1, c:2, d:3, e:[1,2,3]};
(function(path) { return eval('this'+path) }).call(a, '.e[2]');

【问题讨论】:

  • path 来自哪里?此外,return this[path] 有效
  • path 来自客户端的参数。
  • 你确定this[path] 有效吗?
  • 那么它非常危险、缓慢且不需要,只需使用显示的数组语法即可。
  • 不要玩猫捉老鼠的游戏。帮自己一个忙,只需摆脱 eval 并使用 resolve()。查找如何通过字符串访问对象属性,已经得到了很多回答。神速。

标签: javascript node.js security eval code-injection


【解决方案1】:

鉴于 path 是一个静态值 (".e[2]") 并且 a 没有任何恶意访问器,因此这里没有什么不安全的地方,只是完全没有必要。

但是,如果 path 确实来自客户端或其他不受信任的来源,那么将其传递给 eval 是您能做的最糟糕的事情。它可以做 JS 代码在 node 中可以做的所有事情——这足以严重伤害你。

是的,有tons of non-eval alternatives

【讨论】:

  • cmets 声明 path 是从客户端传入的值,因此它远非静态或安全。
  • @NeilSmithline:谢谢,问题中没有说明。更新了我对该案例的回答。
  • 是的,我最终选择了 lodash 3.9.* 的 _.get(),这正是我所需要的。
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多