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