蓝桥杯-网络安全比赛(5)基础学习-JavaScript原型链的prototype、constructor、object.create()、__proto__

JavaScript的prototype、constructor、Object.create()和__proto__通常不直接作为解题的关键,但它们对于理解和分析Web应用的安全性至关重要。
网络安全比赛通常涉及Web应用的漏洞挖掘和攻击,这要求参赛者具备深厚的Web开发知识,包括JavaScript的原型链和继承机制。
  1. 原型链污染:参赛者可能需要了解prototype__proto__以识别和利用原型链污染漏洞。
    攻击者可能通过修改对象的原型来影响所有继承自该原型的对象,从而执行恶意代码或绕过安全限制。
  2. 对象操作和属性访问:在网络安全比赛中,参赛者经常需要分析JavaScript对象的结构和属性。
    了解prototypeconstructor可以帮助他们更好地理解对象的来源和行为,从而找到潜在的漏洞。
  3. 代码审计:参赛者在审计Web应用的源代码时,可能会遇到使用Object.create()创建对象的代码。
    了解这种方法可以帮助他们理解对象的创建过程和属性继承,从而发现潜在的安全问题。
  4. 绕过安全限制:在某些情况下,攻击者可能会尝试利用JavaScript的原型链和继承机制来绕过浏览器的安全限制或Web应用的安全机制。
    了解这些概念可以帮助参赛者识别和防御这类攻击。

原型链

JavaScript的原型链机制是JavaScript对象继承属性或方法的主要方式。
每个JavaScript对象(除了null)都有一个指向它的原型(prototype)对象的内部链接。
这个原型对象自身也可以有原型,这样一层一层地链接下去,就构成了原型链。

prototype

每个函数都有一个 prototype 属性,它是一个对象,用于存储可以由特定类型的所有实例共享的属性和方法。
当尝试访问一个对象的属性时,如果该对象自身没有这个属性,那么 JavaScript 引擎会在该对象的 __proto__(即其原型)上查找这个属性,这个过程会一直持续到找到属性或者到达原型链的末端(通常是 null)。

function Person(name) {  this.name = name;  
}  Person.prototype.greet = function() {  console.log(`Hello, ${this.name}!`);  
};  const alice = new Person('Alice');  
const bob = new Person('Bob');  Person.prototype.age = 30; // 所有实例的 age 属性都是 30  console.log(alice.age); // 输出: 30  
console.log(bob.age); // 输出: 30
alice.greet(); // 输出: Hello, Alice!

谨慎扩展内置对象的原型:修改内置对象的原型(如 Object、Array
等)可能会导致不可预见的副作用,因为其他代码可能也依赖于这些内置对象的行为。

constructor

每个对象都有一个 constructor 属性,它指向创建该对象实例的构造函数。
通常,当我们修改 prototype 时,需要确保 constructor 指向正确的构造函数,以避免混淆。
案例:

function Person(name) {  this.name = name;  
}  Person.prototype.greet = function() {  console.log(`Hello, ${this.name}!`);  
};  
// 忘记设置 constructor,可能导致问题  
const alice = new Person('Alice');  
console.log(alice.constructor === Person); // 输出: false,应该是 true  // 确保 constructor 指向正确的构造函数  
Person.prototype.constructor = Person;  
console.log(alice.constructor === Person); // 输出: true

Object.create()

Object.create() 方法创建一个新对象,使用现有的对象来提供新创建的对象的 __proto__
案例:

const personProto = {  greet: function() {  console.log(`Hello, ${this.name}!`);  }  
};  const bob = Object.create(null); // 没有原型链  
bob.greet(); // 报错:bob.greet is not a functionconst alice = Object.create(personProto);  
alice.name = 'Alice';  
alice.greet(); // 输出: Hello, Alice!

__proto__

__proto__ 是一个内部属性(在大多数现代浏览器中是可访问的),它指向对象的原型。(通常不会直接操作 __proto__,而是使用 Object.create() 或构造函数来设置对象的原型。)
案例:

function Person(name) {  this.name = name;  
}  const alice = new Person('Alice');  console.log(alice.__proto__ === Person.prototype); // 输出: true

不要直接修改 prototype __proto__:尽量通过添加属性或方法到原型对象来扩展对象的功能,而不是直接修改原型对象本身。
更好的做法是使用 Object.definePropertyObject.assign 等方法来扩展对象,而不是直接修改 __proto__

例题

题目1

创建一个 Animal 构造函数,它有一个 speak 方法。
然后创建一个 Dog 构造函数,它继承自 Animal 构造函数,并有一个 bark 方法。
最后,创建一个 Dog 的实例并调用它的 speak 和 bark 方法。

解答:

function Animal() {}  Animal.prototype.speak = function() {  console.log('The animal speaks.');  
};  function Dog() {}  // Dog 继承自 Animal  
Dog.prototype = Object.create(Animal.prototype);  
Dog.prototype.constructor = Dog;  Dog.prototype.bark = function() {  console.log('The dog barks.');  
};  const myDog = new Dog();  
myDog.speak(); // 输出: The animal speaks.  
myDog.bark(); // 输出: The dog barks.

题目2

创建一个Vehicle基类,它有一个move方法。
接着创建两个派生类Car和Bicycle,它们继承自Vehicle类,
并且各自添加了自己的特性方法(Car有honk方法,Bicycle有pedal方法)。
最后,创建这两个派生类的实例,并调用它们的方法。

要求:

  1. 使用原型链来实现继承。
  2. 确保每个对象的constructor属性指向正确的构造函数。
  3. 使用Object.create()来设置原型。

解答:

// 1. 创建 Vehicle 基类  
function Vehicle() {  // 构造函数内容(如果有的话)  
}  Vehicle.prototype.move = function() {  console.log('The vehicle is moving.');  
};  // 2. 创建 Car 类,继承自 Vehicle  
function Car() {}  // 使用 Object.create() 设置原型  
Car.prototype = Object.create(Vehicle.prototype);  
Car.prototype.constructor = Car; // 确保 constructor 指向正确的构造函数  Car.prototype.honk = function() {  console.log('The car honks.');  
};  // 3. 创建 Bicycle 类,继承自 Vehicle  
function Bicycle() { }  // 使用 Object.create() 设置原型  
Bicycle.prototype = Object.create(Vehicle.prototype);  
Bicycle.prototype.constructor = Bicycle; // 确保 constructor 指向正确的构造函数  Bicycle.prototype.pedal = function() {  console.log('The bicycle is being pedaled.');  
};  // 4. 创建实例并调用方法  
const myCar = new Car();  
myCar.move(); // 输出: The vehicle is moving.  
myCar.honk(); // 输出: The car honks.  const myBicycle = new Bicycle();  
myBicycle.move(); // 输出: The vehicle is moving.  
myBicycle.pedal(); // 输出: The bicycle is being pedaled.  // 5. 验证原型链和 constructor  
console.log(myCar.__proto__ === Car.prototype); // 输出: true  
console.log(myCar.__proto__.__proto__ === Vehicle.prototype); // 输出: true  
console.log(myCar.constructor === Car); // 输出: true  console.log(myBicycle.__proto__ === Bicycle.prototype); // 输出: true  
console.log(myBicycle.__proto__.__proto__ === Vehicle.prototype); // 输出: true  
console.log(myBicycle.constructor === Bicycle); // 输出: true

总结

通过今天的学习,你应该能够更好地理解JavaScript的原型链和继承机制,并能够在实际开发中灵活运用这些概念。
同时,你也应该意识到这些概念在Web应用安全性分析中的重要性,这对于参与网络安全比赛或从事Web安全相关工作的人来说是非常有价值的。

系列文章

蓝桥杯-网络安全比赛(4)基础学习-JavaScript同步与异步、宏任务与微任务
蓝桥杯-网络安全比赛(3)基础学习- JavaScript的闭包与this
蓝桥杯-网络安全比赛(2)基础学习-正则表达式匹配
蓝桥杯-网络安全比赛(1)基础学习-使用PHP、PYTHON、JAVA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的层、算子和函数空间

目录 一、层、算子和函数空间概念 二、层(Layers) 三、算子(Operators) 3.1常见算子 3.2常见算子的性质 四、函数空间(Function Space) 一、层、算子和函数空间概念 层(Layers&#xff09…

自建远程桌面服务器,控制免root安卓手机和pc

RustDesk是一个开源的远程桌面软件,它允许用户通过互联网在不同设备之间共享桌面和控制权限。这款软件以最少的配置提供了自托管和安全保障,是一个类似于TeamViewer的开源替代品​ (RustDesk)​。RustDesk支持在Windows、macOS、Linux、iOS、Android以及…

[数据概念]对原始公开数据赋权的思考

“ 对于原始、公开信息,要充分保障整个社会对该类信息资源的合理利用,以维护信息公平和促进更大范围的创新。。” 2022年12月,党中央、国务院发布《关于构建数据基础制度更好发挥数据要素作用的意见》(以下称《数据二十条》&#…

Java8新特性--lambda表达式

lambda表达式本质上是一个匿名函数,在lambda表达式中我们只需要关心参数列表以及方法体。优点是可以减少代码量。 1.语法 基本语法:(参数)->表达式 或 (参数) -> {语句;} 2.函数式接口 要了解lambda表达式,首先要了解什么是函数式接口…

互联网大厂ssp面经之路:计算机网络part2

什么是 HTTP 和 HTTPS?它们之间有什么区别? a. HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在Web上传输数据的协议。它们之间的区别在于安全性和数据传输方式。 b. HTTP是一种不安全的协议&…

[RK3588-Android12] 关于HDMIN-IN视频调试命令

问题描述 如题关于HDMIN-IN视频应该如何调试。 解决方案: 视频调试 HDMI-IN 设备在内核中会被注册为 video 设备,生成的节点如:/dev/video8。 可以通过 v4l2-ctl 命令来获取设备信息和抓帧。 1.获取设备信息: v4l2-ctl -d /dev…

变分自编码器生成新的手写数字图像

变分自编码器(Variational Autoencoder,VAE)是一种生成模型,通常用于学习数据的潜在表示,并用于生成新的数据样本。它由两部分组成:编码器和解码器。 编码器(Encoder):接…

用Echarts词云数据可视化热词表白​​

目录 1、使用前准备 2、准备工作 3、盒子搭建 4、整体展现 1、使用前准备 找到表白对象(重中之重!),不要一见钟情(个人觉得:一见钟情属于见色起意!),因为数据可视化需…

高效洁净,静音运行:油烟净化器助力餐饮业绿色发展

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们 餐饮业作为繁忙城市中蓬勃发展的一部分,一直在不懈努力,以满足人们对美食的渴望。但在烹饪的背后&#…

Unity自定义框架(2)-----------事件中心

前言: Unity作为一款强大的游戏开发引擎,提供了丰富的工具和框架,其中事件中心框架是一个备受关注的重要组成部分。本文将深入探讨Unity事件中心框架的重要性以及它在游戏开发中的作用。 什么是事件中心框架? 事件中心框架是一…

Python中的Lambda匿名函数

背景 Lambda匿名函数在Python中经常出现,小巧切灵活,使用起来特别方便,但是小编建议大家少使用,最好多写几行代码,自定义个函数。 既然Python中存在Lambda匿名函数,那么小编本着存在即合理的原则&#xf…

海外仓为何要做仓库管理系统?位像素海外仓系统的仓库管理功能有哪些?

在当今繁荣的跨境电商市场中,海外仓已经成为了许多电商企业的重要选择。但是,海外仓的成功与否并不仅仅取决于其位置和规模,同样重要的是其仓库管理系统的有效性。那么,海外仓为何要做仓库管理系统呢?让我们一起来探讨…

统计机构编配

办公室、组织人事处、政策法规处、国民经济综合统计处、国民经济核算处、工业统计处、固定资产投资统计处、贸易外经统计处、城镇化和人口就业统计处、农村统计处、能源统计处、服务业统计综合处、普查处、机关党委,市社会经济调查中心、市统计执法监察支队、市社情…

“成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…

可视化大屏的应用(9):智慧旅游和智慧景区

可视化大屏在智慧旅游领域具有多种价值,可以为旅游管理者和游客提供更加便捷、优质的服务和体验。本期大千UI工场带来智慧旅游和智慧景区的可视化大屏界面,供大家欣赏。 可视化大屏在智慧旅游领域的价值如下: 提供全面的信息展示&#xff0…

蓝桥杯每日一题:母亲的奶牛(BFS)

农夫约翰有三个容量分别为 A,B,C升的挤奶桶。 最开始桶 A 和桶 B 都是空的,而桶 C 里装满了牛奶。 有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过程中间不能有任何停顿,并…

数据结构:构建完全二叉查找树

文章目录 1、步骤 1: 对给定数组排序2、步骤 2: 递归构建完全二叉查找树3、注意4、在有序数组中寻找根结点位置5、代码实现6、其他方法?基本思路插入操作删除操作特别考虑 对于一个给定序列的二叉查找树,有很多种,但是完全二叉查找树只有一种…

浏览器工作原理与实践--分层和合成机制:为什么CSS动画比JavaScript高效

在上一篇文章中我们分析了CSS和JavaScript是如何影响到DOM树生成的,今天我们继续沿着渲染流水线向下分析,来聊聊DOM树之后所发生的事情。 在前面《05 | 渲染流程(上):HTML、CSS和JavaScript文件,是如何变成…

【网站项目】医院核酸检测预约挂号小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

4.1-4.5算法刷题笔记(17道题)

4.1-4.5算法刷题笔记 1. 区间和2. 区间合并3. 用队列实现栈(queueMain queueTemp;)4. 最小栈 1. 单链表模板5. 单链表 2. 双链表模板6. 双链表 3. 模拟栈7. 模拟栈(一个数组即可)8. 表达式求值 4. 队列 tt -1,hh 0;9. 模拟队列 5. 单调栈10. 单调栈 6…