当前位置: 首页 > news >正文

Node.js原型链污染

认识原型链:

function Test(){
    this.name = 'zqc'
    this.say = function(){
        console.log('学习')
}
var obj3 = new Test()
var obj4 = new Test()
}

上述代码中,obj3,obj4都是Test的实例对象,Test是obj3和obj4的构造函数。实例都有一个构造函数属性(constructor)指向构造函数,通过构造函数创建的对象拥有构造函数内部定义的属性和方法

在js中,每一个对象都有一个特殊的属性叫做原型(prototype),它指向另一个对象,这个对象叫做原型对象,原型对象是用来共享属性和方法的。1,原型对象有一个constructor属性指向构造函数本身(Test),原型对象包含属性和方法。原型对象的属性和方法会被继承到所有通过原型链于它相连的对象

function Test(name, age){
    this.name = name
    this.age = age
}
 
Test.prototype.say = function(){
    console.log('我能说话')
}
var obj3 = new Test('Jack', 26)
var obj4 = new Test('Rose', 25)
 
obj3.say()    // 我能说话
obj4.say()    // 我能说话

隐式原型__proto__

1.__proro__,在js中每个对象都有一个隐藏的__proto__属性,它指向创建它的构造函数的原型对象(Test.prototype)

2.__proto__存在的意义在于为原型链查找提供方向,原型链查找靠的是__proto__,而不是prototype

 原型链

每一个js对象都有一个隐藏的原型对象属性__proto__,那Test.prototype也是js中的对象,那它的__proto__是什么呢?

1.Test.prototyped的隐式原型就是Object.prototype

2.所有的对象,包括构造函数的原型对象,最终都继承自Object.prototype,这是js原型链的顶点

同样的,Object.prototype也存在__proto__,Object.prototype 是原型链的末端,它的原型是 null,是所有对象原型链的最终节点。因此,它不再有自己的原型,所以Object.prototype.__proto__指向null

Object.prototype 是原型链的终点,因为它不再有其他原型。null 是原型链的终止条件,表示查找结束。

 在js中,每一个对象都有一个特殊的属性叫做原型(prototype),它指向另一个对象,这个对象叫做原型对象,原型对象是用来共享属性和方法的

对象有一个属性(__proto__)指向构造函数的原型对象

普通对象和函数对象:

在javascript中,只有函数对象才具有prototype属性

function Person(name) {
  this.name = name;
}

// 在 Person 的 prototype 上定义方法
Person.prototype.sayHello = function () {
  return `Hello, my name is ${this.name}`;
};

const person1 = new Person("Alice");
const person2 = new Person("Bob");

console.log(person1.sayHello()); // "Hello, my name is Alice"
console.log(person2.sayHello()); // "Hello, my name is Bob"

console.log(person1.__proto__ === Person.prototype); // true
console.log(person2.__proto__ === Person.prototype); // true

Person是一个函数对象,它有一个prototype属性

Person.prototype是一个对象,所有通过new Person()创建的实例的原型都指向Person.prototype

这使得所有实例可以共享Person.prototype上的属性和方法

相反,普通对象没有prototype这个属性

原型链的继承

所有类对象在实例化的时候将会拥有prototype的属性和方法,这个特性被用来实现js中的继承机制

function Father(){
   this.first_name = 'LeBron';
   this.last_name = 'james';
}
function Son(){
    this.first_name = 'Bronny';
}
Son.ptototypre=new Father();
let son= new Son();
console.log('Name:${son.first_name}${son.last_name}')

 主要流程:

    在对象son中寻找last_name
    无法找出,则在son.__proto__中寻找last_name
    如果仍然无法找到,则继续在son.__proto__.__proto__中寻找last_name
    依次寻找,直到null结束。如:object.prototype的__proto__就是null

原型链污染:

原型链污染利用了javaScript的原型链机制,通过恶意修改对象的原型(__proto__或[[Protortpe]])从而影响依赖这些原型属性或方法的代码逻辑。这种漏洞可能发生在任何使用 JavaScript 的环境中,包括浏览器和 Node.js。

原理

在 JavaScript 中,对象的原型链用于实现继承和共享属性。如果攻击者能够通过某种方式修改对象的原型(通常是 Object.prototype),那么所有继承自该原型的对象都会受到影响

常见的污染方式:

不安全地处理用户输入:如果代码允许用户输入动态地修改对象的属性,攻击者可能会利用这一点注入恶意属性。

使用 Object.assign() 或类似方法时未正确处理目标对象:如果目标对象是 Object.prototype 或其他共享原型,可能会导致全局污染

例如:

const uesrInput = {__proto__:{isAdmin:ture}};
Object.assign({},userInput);

用户提供的输入是userInput,它有一个__proto__属性,该属性的值是一个包含isAdmin:ture的对象

Object.assign方法会将所有可枚举的自有属性从原对象复制到目标对象,这里的原对象是userInput,目标对象是空对象{},


文章转载自:

http://jsuHSgT8.dfLtx.cn
http://2nWOdYkl.dfLtx.cn
http://UCe1XnS4.dfLtx.cn
http://W0G21g2L.dfLtx.cn
http://oowwelNO.dfLtx.cn
http://fbFp47ny.dfLtx.cn
http://iDoCEeVv.dfLtx.cn
http://O8Aywxvr.dfLtx.cn
http://wc3km1FB.dfLtx.cn
http://v3Agw0pu.dfLtx.cn
http://H9nIf5OW.dfLtx.cn
http://u0a88Nw5.dfLtx.cn
http://aX4ajEOz.dfLtx.cn
http://oOVCt5p4.dfLtx.cn
http://1vAYy2Nq.dfLtx.cn
http://LsAmoFNf.dfLtx.cn
http://Hs5XNjvw.dfLtx.cn
http://6xL4j4Qv.dfLtx.cn
http://YPN2EYVl.dfLtx.cn
http://p944rRfN.dfLtx.cn
http://pquWHbJh.dfLtx.cn
http://mVIpbECG.dfLtx.cn
http://F7U9TgOO.dfLtx.cn
http://EWEhycMk.dfLtx.cn
http://06QV6FKG.dfLtx.cn
http://EPyLjMLn.dfLtx.cn
http://XoRY3jO9.dfLtx.cn
http://3BDuaxNo.dfLtx.cn
http://qNr7nXrf.dfLtx.cn
http://wnv2BcKk.dfLtx.cn
http://www.dtcms.com/a/57383.html

相关文章:

  • 大数据_数仓建模_八股
  • 开源项目介绍:Native-LLM-for-Android
  • mitt 依赖库详解
  • 安徽省考计算机专业科目2025(持续更新)
  • SpringCloud—概述—01
  • 人工智能之数学基础:正交矩阵
  • React封装通用Form组件,类型转换、命名控件样式隔离、支持表单验证、位置自定义、自定义布局、提示信息info等功能。未采用二次封装调整灵活,包含使用文档
  • xxx **5. 物理安全** 详细解读
  • 新能源汽车能量管理:开启绿色出行新动力
  • 常见的 Git 命令
  • UV,纹理,材质,对象
  • Python----数据分析(Matplotlib四:Figure的用法,创建Figure对象,常用的Figure对象的方法)
  • MES机联网4:文档资料
  • MySQL中的脏读与幻读:概念、影响与解决方案
  • 进程模型2-进程优先级
  • 类和对象:
  • kafka消息中间件的rebalance机制
  • 介绍一下Qt中的事件过滤
  • Array and string offset access syntax with curly braces is deprecated
  • 《探秘课程蒸馏体系“三阶训练法”:解锁知识层级递进式迁移的密码》
  • ESP32 UART select解析json数据,上位机控制LED灯实验
  • 如何提取图片文字
  • 高性能算法NGO!北方苍鹰优化算法(Northern Goshawk Optimization,NGO)
  • 解决JDK 序列化导致的 Redis Key 非预期编码问题
  • 手写简易Tomcat核心实现:深入理解Servlet容器原理
  • 萌新学 Python 之面向对象的下划线控制权限访问
  • PHP:phpstudy无法启动MySQL服务问题解决
  • Java基础面试题全集
  • 快速使用MASR V3版不能语音识别框架
  • 动态规划完全背包系列一>完全背包