我的疑问是:我应该检查原始值(即使用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
答案 0 :(得分:0)
我不确定你是什么意思,恶意对象就像一个数字但可以执行任何代码
您所做的只是覆盖自定义对象valueOf
的{{1}}方法。
来自MDN,
JavaScript调用valueOf方法将对象转换为 原始值
在你的代码Num
中,因为n是Object类型而1是基本类型,所以javascript尝试调用var x = n + 1;
来获取n的原始值并将其添加到1。
由于您自己的对象使用了重叠的valueOf
方法,因此将执行自定义valueOf
以将对象转换为基本类型。
详细了解valueOf。