可以将JavaScript字符串评估为没有eval的函数吗?

时间:2018-12-08 14:16:23

标签: javascript eval

我正在执行代码审核,由于不良行为,攻击者可能会覆盖toString方法。它正在使用字符串而不是方法覆盖toString方法。

采用以下代码:

let a = new Object();
a.toString = "function(){ return 'hello world' }"

a.toString是字符串,而不是函数。因此,a.toString()不起作用。

是否有可能导致意外执行toString字符串的黑客行为(考虑到该字符串可以是任何东西,并且不考虑评估)?

1 个答案:

答案 0 :(得分:1)

根据您的清晰评论:

  

我正在执行代码审核,并且toString方法可以重写。由于输入来自客户端,因此它将用客户端发送的字符串覆盖实例的toString方法。我想知道这里是否有安全隐患。

除非您的代码执行某些操作以将该字符串转换为函数(eval(a.toString)new Function(a.toString)btn.onclick = a.toString;,...),否则它不会成为一个函数,因此从某种意义上讲这不是安全隐患。尝试在toString上(显式或隐式)调用a的任何事物都会得到一个错误。例如,这是toString的隐式使用:

let a = new Object();
a.toString = "function(){ return 'hello world' }"
String(a); // TypeError: a.toString is not a function

这显然不是可取的,但是您说这是一个错误,并且您正在尝试探索可以利用它的程度。我说这不是特别可利用的。