javascript - Object.prototype.toString.call() 是一个安全问题吗?
问题描述
我的疑问是:我应该只检查原始值(即使用Number.isFinite()
or Number.isInteger()
),因为“对象”值容易出现安全漏洞吗?
如果是,s _.isNumber()
应该避免使用像 Underscore'(基于 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
您自定义 Object 的方法Num
。
来自 MDN,
JavaScript 调用 valueOf 方法将对象转换为原始值
在您的代码var x = n + 1;
中,由于 n 是 Object 类型,而 1 是原始类型,javascript 会尝试调用valueOf
以获取 n 的原始值并将其添加到 1。
由于它是您自己的对象和您的覆盖valueOf
方法,因此您的自定义valueOf
将被执行以将 Object 转换为原始类型。
阅读有关valueOf的更多信息。
推荐阅读
- matlab - 如何将网格拟合到一组点中的某些点?
- javascript - React Image Mapper - 单击时更改状态,并立即进行 API 调用
- c# - 是否可以使用正则表达式从整个字符串中删除每个出现的字符及其后的一个字符?
- wordpress - Wordpress如何在执行cron之前注册全局对象,以便在cron作业期间可用?
- openapi - 如何在不使用 confluence 插件的情况下将 swagger/openapi yaml 文件包含到 doctoolchain 中并获得类似 swagger 的输出?
- python - Python - 具有多个 __init__() 的多重继承?
- vis.js-network - 在水平轴上集中节点
- facebook - Facebook 正在阻止来自我的服务器的请求
- javascript - 如何将提取的函数传递给自定义函数?
- python - 将连续的 SpcCy 实体提取到 Dataframe 中