Object.prototype.toString.call()是一个安全问题?

时间:2018-04-27 10:45:46

标签: javascript security underscore.js primitive

我的疑问是:我应该检查原始值(即使用Number.isFinite()Number.isInteger()),因为“对象”值容易出现安全漏洞吗?

如果是,应该避免像Underscore's _.isNumber()(基于Object.toString)这样的方法吗?

以下是恶意对象的示例,其行为类似于数字,但可以执行任何代码。

class Num extends Number {

    constructor (q) {
        super (q);
        this.value = q;
    }

    valueOf () {
        console.log('HACKED');
        return this.value;
    }
}

var n = new Num(5); // Num {5, value: 5}
console.log(Object.prototype.toString.call(n)); // [object Number]
console.log(Number.isFinite(n)); // false
var x = n + 1; // HACKED
console.log(x); // 6

1 个答案:

答案 0 :(得分:0)

我不确定你是什么意思,恶意对象就像一个数字但可以执行任何代码

您所做的只是覆盖自定义对象valueOf的{​​{1}}方法。

来自MDN,

  

JavaScript调用valueOf方法将对象转换为   原始值

在你的代码Num中,因为n是Object类型而1是基本类型,所以javascript尝试调用var x = n + 1;来获取n的原始值并将其添加到1。

由于您自己的对象使用了重叠的valueOf方法,因此将执行自定义valueOf以将对象转换为基本类型。

详细了解valueOf