Javascript Object.prototype.toString.call()是否存在安全问题?

Javascript Object.prototype.toString.call()是否存在安全问题?,javascript,security,underscore.js,primitive,Javascript,Security,Underscore.js,Primitive,我的疑问是:我是否应该只检查原始值(即使用Number.isFinite()或Number.isInteger()),因为“对象”值容易出现安全漏洞 如果是,则应避免使用下划线“s”等方法。\u.isNumber()(基于Object.toString) 下面是一个恶意对象的示例,其行为类似于数字,但可以执行任何代码 class Num extends Number { constructor (q) { super (q); this.value =

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

如果是,则应避免使用下划线“
s”等方法。\u.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

我不知道你说的恶意对象是什么意思,它的行为就像一个数字,但可以执行任何代码

您所做的只是覆盖自定义对象的
valueOf
方法
Num

来自MDN

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

在你的代码中,
var x=n+1,因为n是Object类型,1是primitive类型,所以javascript尝试调用
valueOf
来获取n的primitive值并将其添加到1中

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


阅读更多信息。

我获得一个值(n),检查类型,因为我希望它是一个数字,我通过了测试(Object.toString),然后我做了一个简单的求和,它可以工作,所以我没有注意到恶意代码“console.log('HACKED')”也被执行。valueOf被执行只是因为你试图用一个对象添加一个原语数字。否则它不会被执行。此外,流行的库(如下划线.js)是开源的,代码在GitHub中提供。因此,您可以自己检查代码中是否有可疑的行,并决定是否使用。像这样受欢迎的库不会有任何问题。但是如果它是一个新的/未知的库,请确保验证它的来源或者它是否可信。所以我的问题的答案是“是”?