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

XSS漏洞及常见处理方案

文章背景:
在近期项目安全测试中,安全团队发现了一处潜在的 跨站脚本攻击(XSS)漏洞,该漏洞可能导致用户数据被篡改或会话劫持等安全风险。针对这一问题,项目组迅速响应,通过代码修复、输入过滤、输出编码等多层防护措施,彻底消除了隐患。

为系统性总结此次漏洞的成因、修复方案及防护经验,开发团队特别编写了XSS漏洞及常见处理方案知识文献,涵盖漏洞原理、攻击场景、修复建议及长期防护策略,旨在为后续项目提供参考,避免同类问题重现。在此,特别鸣谢公司开发团队的雷神及参与修复的开发同事的紧密协作,正是大家的专业与高效,才使得漏洞得以及时闭环,并为团队积累了宝贵的安全实践知识。未来,我们将持续强化安全开发意识,筑牢项目安全防线。

什么是 XSS 漏洞? 
        XSS 漏洞,全称为跨站脚本攻击(Cross-Site Scripting)漏洞,攻击者通过在⽬标⽹站中注 
⼊恶意脚本,使得⽤⼾在访问该⽹站时,浏览器会执⾏这些恶意脚本,从⽽达到攻击者获取⽤
⼾信息、控制⽤⼾操作等⽬的的安全漏洞。
⼀般情况下,⽤⼾输⼊信息提交后,后端直接保存到数据库,⽤⼾需要查看信息时,后端直
接从数据库查询信息返回前端展⽰,如下图:
容易出现漏洞的地⽅基本和富⽂本都有关系,如⽹站后台⽂章编辑、前台评论区,如果⽤⼾
输⼊的内容包含脚本,直接保存到数据库,显⽰详情时再直接显⽰,就可能会执⾏脚本,例如
以下 XSS 脚本被浏览器渲染执⾏(即弹窗)。
<script>alert('XSS');</script>
<img src="x" onerror="alert('XSS')">
<input type="text" value="<script>alert('XSS')">
<svg/onload=alert('XSS')>
<img src="x" onerror="alert(String.fromCharCode(88,83,83))">
<script>document.write('<img src="x" onerror="alert(\'XSS\')">')</script>
<svg><animate onrepeat=top['ale'+'rt'](36) attributeName=x dur=1s repeatCount=2 />
<iframe src=‘http://www.baidu.com/123.js’></iframe>
<svg><animate+onrepeat=top['ale'+'rt'](36)+attributeName=x+dur=1s+repeatCount=2+/>
<iframe src=‘http://xxx.com/123.js’></iframe>
<u+onclick-alert(1)>aaa</u>

漏洞危害
1: 窃取⽤⼾信息
攻击者可通过 XSS 漏洞注⼊恶意脚本,当⽤⼾访问被攻击的⽹站时,脚本就会收集⽤⼾输
⼊的账号、密码等登录信息,并发送给攻击者,进⽽导致⽤⼾账号被盗⽤,个⼈隐私、财产安
全等受到威胁。同时获取⽤⼾在⽹站上填写的其他个⼈信息,如⾝份证号、联系⽅式、家庭住
址等,可能被⽤于精准诈骗。
2:篡改⽹站内容
利⽤ XSS 漏洞修改⽹站的⻚⾯内容,如替换⽹站内容、插⼊恶意⼴告等,使⽹站的正常展
⽰受到破坏,给⽤⼾带来误导性信息,给⽹站带来严重的负⾯影响。
其他还有如实施钓⻥攻击、传播恶意代码等⾏为。
常⻅处理⽅案
从前⾯时序图中可以看出,修复切⼊点可以这⼏步中考虑:
第 2 步:前端提交⽤⼾输⼊信息时,对输⼊内容进⾏脚本过滤。
第 3 步:后端对前端传⼊的内容也进⾏脚本过滤。
第 12 步:前端显⽰详情时禁⽤脚本渲染。
⽅案⼀:前端输⼊过滤
html 输⼊转义
使⽤第三⽅库类似 DOMPurify 来清理和转义输⼊的 html。
import DOMPurify from 'dompurify';
2
3 // 假设这是⽤⼾输⼊的 HTML 内容
4 const userInput = `<img src="x" onerror="alert('XSS')">Hello <b>world</
b>!</p>`;
5
6 // 使⽤ DOMPurify 清理⽤⼾输⼊
7 const sanitizedInput = DOMPurify.sanitize(userInput);
8
9 // 将清理后的内容安全地插⼊到⻚⾯中
10 document.getElementById('output').innerHTML = sanitizedInput;
url 转义
处理 url 输⼊的时候,使⽤ encodeURIComponent 来避免⽤⼾输⼊的恶意链接引发的攻
击。
// ⽤⼾输⼊的内容
2 const userInput = "Hello world & welcome to XSS <script>alert('XSS')</s
cript>";
3
4 // 使⽤ encodeURIComponent 对⽤⼾输⼊进⾏编码
5 const encodedInput = encodeURIComponent(userInput);
6
7 // 构建带有查询参数的 URL
8 const url = `https://example.com/search?query=${encodedInput}`;
严格输⼊验证
除了转义外常规的表单类型提交,尽可能对⽤⼾输⼊进⾏严格的验证,确保输⼊内容符合预
期格式。例如对于数字、⽇期等特定类型的输⼊,可以使⽤正则表达式来限制输⼊的格式。
// 验证邮箱格式
2 const validateEmail = (_, value) => {
3 if (!/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(valu
e)) {
4 return Promise.reject(new Error('请输⼊正确的邮箱地址'));
5 }
6 return Promise.resolve();
7 };
使⽤成熟框架
使⽤ React/Vue 等框架,框架⾃带编译器会将模板 /jsx 解析为树,在 redderer ⾥调⽤
DOM API,减少 encode 操作避免较⼤部分的 xss 隐患。
标签属性异常处理
关注 prerender / SSR 的 hydrate 过程会⽣成 html 、dangerouslySetInnerHTML、
οnlοad= 字符串、href= 字符串、onrepeat= 字符串和⼀些常规的标签属性的过滤异常处
理。
1 import React, { useEffect } from 'react';
2 import ReactDOM from 'react-dom';
3
4 // 安全过滤函数
5 const sanitizeHTML = (html) => {
6 // 简单的正则过滤:去除 onload, href 等事件处理程序
7 return html
8 .replace(/on\w+="[^"]*"/g, '') // 去除所有事件属性如 onload, onerror
等
9 .replace(/<script.*?>.*?<\/script>/g, '') // 去除 <script> 标签
10 .replace(/<iframe.*?>.*?<\/iframe>/g, '') // 去除 <iframe> 标签
11 .replace(/javascript:/g, ''); // 去除 javascript: 协议
12 };
13
14 // ⽰例组件
15 const PrerenderedComponent = ({ unsafeHTML }) => {
16 useEffect(() => {
17 // 仅对 SSR 渲染时进⾏ HTML 安全过滤
18 const safeHTML = sanitizeHTML(unsafeHTML);
19 document.getElementById('content').innerHTML = safeHTML;
20 }, [unsafeHTML]);
21
22 return (
23 <div id="content">
24 {/* 使⽤ dangerouslySetInnerHTML 且已清理的 HTML */}
25 <div dangerouslySetInnerHTML={{ __html: unsafeHTML }} />
26 </div>
27 );
28 };
29
30 // SSR 或 Prerender 渲染时传⼊的潜在不安全内容
31 const unsafeHTML = `
32 <h1>Welcome</h1>
33 <p>Click here: <a href="javascript:alert('XSS')">Link</a></p>
34 <img src="image.jpg" onload="alert('XSS')">
35 <script>alert('XSS')</script>
36 `;
37
38 ReactDOM.hydrate(
39 <PrerenderedComponent unsafeHTML={unsafeHTML} />,
40 document.getElementById('root')
41 );
避免使⽤内联事件
使⽤原⽣ html 时候应该避免在 HTML 中直接使⽤内联事件处理程序,改⽤外部脚本⽂件。
富⽂本过滤
使⽤ textContent innerText 来设置⽤⼾输⼊的内容,⽽不是 innerHTML
使⽤富⽂本或者脚本编辑器等⻚⾯⽅案的时候输⼊的过滤采⽤ DOMPurify 进⾏处理。
1import React, { useState } from 'react';
2 import DOMPurify from 'dompurify';
3
4 const RichTextEditor = () => {
5 const [inputValue, setInputValue] = useState('');
6 const [sanitizedContent, setSanitizedContent] = useState('');
7
8 // 处理输⼊框变化
9 const handleInputChange = (e) => {
10 setInputValue(e.target.value);
11 };
12
13 // 提交并清理输⼊的 HTML
14 const handleSubmit = () => {
15 // 使⽤ DOMPurify 清理⽤⼾输⼊的 HTML
16 const cleanContent = DOMPurify.sanitize(inputValue);
17 setSanitizedContent(cleanContent);
18 };
19
20 return (
21 <div>
22 <h2>富⽂本编辑器</h2>
23
24 {/* 富⽂本编辑器 */}
25 <textarea
26 value={inputValue}
27 onChange={handleInputChange}
28 placeholder="请输⼊内容..."
29 rows="5"
30 cols="40"
31 ></textarea>
32 <br />
33
34 <button onClick={handleSubmit}>提交</button>
35
36 <h3>清理后的内容:</h3>
37 <div
38 id="output"
39 dangerouslySetInnerHTML={{ __html: sanitizedContent }}
40 ></div>
41 </div>
42 );
43 };
44
45 export default RichTextEditor;
采取上述步骤,能在多数情况下确保传⼊接⼝的参数是筛选、处理后的安全内容。但现在多
为前后端分离架构,攻击者可绕过前端,直接调⽤后端 API 接⼝存储含 XSS 隐患的内容。因
此,前端输⼊过滤只是预防⼿段,实际还需结合后⾯两个⽅案。
⽅案⼆:后端存储过滤
后端使⽤开源⼯具 worm-toolkit-valid 来对前端传⼊字符串进⾏验证,该⼯具使⽤注解的⽅
式进⾏⾃定义的验证,⽤法简单,使⽤⽅法如下:
引⼊ jar 包:
<dependency>
2 <groupId>com.worm</groupId>
3 <artifactId>worm-toolkit-valid</artifactId>
4 <version>1.0.6-SNAPSHOT</version>
5 </dependency>
依赖底层 jar 包:
1 <dependency>
2 <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
3 <artifactId>owasp-java-html-sanitizer</artifactId>
4 </dependency>
下⾯为具体的实现逻辑,⾃定义注解:
@Documented
2 @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_
TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_
USE})
3 @Retention(RetentionPolicy.RUNTIME)
4 @Repeatable(NoScriptValid.List.class)
5 @Constraint(validatedBy = {NoScriptValidValidator.class})
6 public @interface NoScriptValid {
7 /**
8 * 提⽰信息(存在错误时,当前字段使⽤)
9 */
10 String message() default "Input must not contain JavaScript code";
11
12 /**
13 * 分组
14 */
15 Class<?>[] groups() default {};
16
17 /**
18 * 扩展对象
19 */
20 Class<? extends Payload>[] payload() default {};
21
22 @Documented
23 @Target({
24 ElementType.METHOD,
25 ElementType.FIELD,
26 ElementType.ANNOTATION_TYPE,
27 ElementType.CONSTRUCTOR,
28 ElementType.PARAMETER,
29 ElementType.TYPE_USE
30 })
31 @Retention(RetentionPolicy.RUNTIME)
32 @interface List {
33 NoScriptValid[] value();
34 }
35 }
Java
1 public class NoScriptValidValidator implements ConstraintValidator<NoS
criptValid, String> {
2 /**
3 * PolicyFactory 是 OWASP Java HTML Sanitizer 提供的⼀个⼯⼚类,⽤于创建
清理策略。
4 * Sanitizers.FORMATTING.and(Sanitizers.LINKS).and(Sanitizers.BLOCK
S).and(Sanitizers.IMAGES).and(Sanitizers.STYLES).and(Sanitizers.TABLE
S) 组合了多种清理策略,例如格式化、链接、块元素、图像、样式和表格等。
5 */
6 private final PolicyFactory policy = Sanitizers.FORMATTING.and(San
itizers.LINKS).and(Sanitizers.BLOCKS).and(Sanitizers.IMAGES).and(Saniti
zers.STYLES).and(Sanitizers.TABLES);
7
8 @Override
9 public boolean isValid(String value, ConstraintValidatorContext con
text) {
10 if (CharSequenceUtil.isBlank(value)) {
11 return true;
12 }
13 // 对输⼊值进⾏清理,然后将清理后的值与原始值进⾏⽐较。如果两者相等,说明输
⼊中不包含需要清理的 HTML 或脚本,验证通过;否则,验证失败。
14 String sanitize = policy.sanitize(value);
15 return CharSequenceUtil.equalsAnyIgnoreCase(sanitize, value);
16 }
17 }
NoScriptValidValidator 为⼀个内置的验证器,⾥⾯集合了⼀些清理策略,如果不满⾜项⽬
需求,可以参照此类重新写⼀个验证器,并设置 policy。
验证代码:
1 public class ExpressSaveDto {
2
3 /**
4 * 计价数量
5 */
6 @NoScriptValid(message = "表达式脚本不能输⼊javascript脚本")
7 private String valuationQuantity;
8
9 /**
10 * 计价单价
11 */
12 @NoScriptValid(message = "表达式脚本不能输⼊javascript脚本")
13 private String valuationUnitPrice;
14 }
如果使⽤嵌套验证的⽅式,需要明确在内部需要校验的对象上加上@Valid 注解
@Data
2 public class ExpFormulaSaveDto {
3
4 /**
5 * 公式名称
6 */
7 @NotBlank(message = "公式名称不能为空")
8 @Size(max = 32, message = "公式名称由⻓度不超过32的⽂本组成")
9 private String name;
10
11 @Valid
12 private List<ExpressSaveDto> expressSaveDtos;
13 }
Java
1 @PostMapping("/saveExpress")
2 public BaseResult<Boolean> saveExpress(@RequestBody @Valid ExpFormulaSa
veDto expFormulaSaveDto) {
3 // TODO
4 return BaseResult.ok();
5 }
当前端传给后端的 valuationQuantity 和 valuationUnitPrice 字段中包含脚本时,后端将提
⽰“表达式脚本不能输⼊ javascript 脚本”。
⽅案三:前端渲染过滤
直接渲染类型的内容前转义
防⽌通过 innerHTML document.write 等⽅法,使⽤ textContent
innerText 来进⾏替代。不可避免使⽤ innerHTML 的时候使⽤第三⽅库类似 DOMPurify
清理和转义接⼝获取的 html 内容。
1 import React, { useState } from 'react';
2 import DOMPurify from 'dompurify';
3
4 const SafeContentRenderer = () => {
5 const [userInput, setUserInput] = useState('');
6 const [outputHTML, setOutputHTML] = useState('');
7
8 // 处理⽤⼾输⼊
9 const handleInputChange = (e) => {
10 setUserInput(e.target.value);
11 };
12
13 // 渲染⽂本内容,避免使⽤ innerHTML
14 const renderText = () => {
15 const textContainer = document.getElementById('textContainer');
16 textContainer.textContent = userInput; // 使⽤ textContent 安全渲染
⽂本
17 };
18
19 // 渲染 HTML 内容,使⽤ DOMPurify 进⾏清理
20 const renderHTML = () => {
21 const sanitizedHTML = DOMPurify.sanitize(userInput);
22 setOutputHTML(sanitizedHTML); // 渲染经过清理的 HTML
23 };
24
25 return (
26 <div>
27 <h2>直接渲染内容⽰例</h2>
28
29 <textarea
30 value={userInput}
31 onChange={handleInputChange}
32 placeholder="请输⼊内容..."
33 rows="5"
34 cols="40"
35 ></textarea>
36
37 <div>
38 <button onClick={renderText}>渲染为⽂本</button>
39 <button onClick={renderHTML}>渲染为HTML</button>
40 </div>
41
42 {/* 渲染纯⽂本内容,避免使⽤ innerHTML */}
43 <div id="textContainer" style={{ marginTop: '20px', fontSize: '16
px' }}></div>
44
45 {/* 渲染 HTML 内容,使⽤ DOMPurify 清理过的内容 */}
46 <div id="htmlOutput" style={{ marginTop: '20px' }} dangerouslySet
InnerHTML={{ __html: outputHTML }}></div>
47 </div>
48 );
49 };
50
51 export default SafeContentRenderer;
设置 CSP
设置 Content Security Policy CSP 头,限制⻚⾯可以加载和执⾏的资源规则,防⽌
恶意脚本的注⼊和执⾏。
1 setHeader('Content-Security-Policy', "default-src 'self'; script-src 's
elf' 'sha256-abc123'; style-src 'self' 'unsafe-inline'; img-src 'self'
data:;");
模板引擎
需要使⽤动态脚本插⼊的时候,使⽤ Handlebars Mustache 等模板引擎执⾏。
<script id="entry-template" type="text/x-handlebars-template">
2 <div>{{message}}</div>
3 </script>
总结
XSS 防护的核⼼是通过严格控制⽤⼾输⼊和输出的内容,避免恶意脚本被注⼊并执⾏。前端
通过转义输⼊、使⽤安全的渲染⽅法、实施 CSP 等措施来防⽌脚本执⾏。后端则应确保输⼊验
证、输出转义,并结合框架⾃带的防护机制,确保数据在渲染时是安全的。前后端共同合作,
形成多层防护,才能有效防⽌ XSS 攻击。

相关文章:

XSS漏洞及常见处理方案

文章背景&#xff1a; 在近期项目安全测试中&#xff0c;安全团队发现了一处潜在的 跨站脚本攻击&#xff08;XSS&#xff09;漏洞&#xff0c;该漏洞可能导致用户数据被篡改或会话劫持等安全风险。针对这一问题&#xff0c;项目组迅速响应&#xff0c;通过代码修复、输入过滤、…...

TCP标志位抓包

说明 TCP协议的Header信息&#xff0c;URG、ACK、PSH、RST、SYN、FIN这6个字段在14字节的位置&#xff0c;对应的是tcp[13]&#xff0c;因为字节数是从[0]开始数的&#xff0c;14字节对应的就是tcp[13]&#xff0c;因此在抓这几个标志位的数据包时就要明确范围在tcp[13] 示例1…...

C/C++条件判断

条件判断 if语句的三种形态 if(a<b){} 、 if(a<b){}else{} 、 if(a<b){}else if(a>b) else{} if语句的嵌套 嵌套的常见错误&#xff08;配对错误&#xff09;,与前面最近的&#xff0c;而且还没有配对的if匹配 错误避免方法&#xff1a;严格使用 { }、先写&am…...

单位门户网站被攻击后的安全防护策略

政府网站安全现状与挑战 近年来&#xff0c;随着数字化进程的加速&#xff0c;政府门户网站已成为政务公开和服务公众的重要窗口。然而&#xff0c;网络安全形势却日益严峻。国家互联网应急中心的数据显示&#xff0c;政府网站已成为黑客攻击的重点目标&#xff0c;被篡改和被…...

# 工具记录

工具记录 键盘操作可视化工具openark64系统工具dufs-webui文件共享zotero文献查看cff explorerNoFencesfreeplane开源思维导图...

C/C++运算

C语言字符串的比较 #include <string.h> int strcmp( const char *str1, const char *str2 );例如: int ret; ret strcmp(str1, str2);返回值&#xff1a; str1 < str2时&#xff0c; 返回值< 0&#xff08;有些编译器返回 -1&#xff09; str1 > str2时…...

CloudWeGo 技术沙龙·深圳站回顾:云原生 × AI 时代的微服务架构与技术实践

2025 年 3 月 22 日&#xff0c;CloudWeGo “云原生 AI 时代的微服务架构与技术实践”主题沙龙在深圳圆满落幕。作为云原生与 AI 微服务融合领域的深度技术聚会&#xff0c;本次活动吸引了来自企业、开发者社区的百余位参与者&#xff0c;共同探讨如何通过开源技术应对智能时代…...

STM32移植文件系统FATFS——片外SPI FLASH

一、电路连接 主控芯片选型为&#xff1a;STM32F407ZGT6&#xff0c;SPI FLASH选型为&#xff1a;W25Q256JV。 采用了两片32MB的片外SPI FLASH&#xff0c;电路如图所示。 SPI FLASH与主控芯片的连接方式如表所示。 STM32F407GT6W25Q256JVPB3SPI1_SCKPB4SPI1_MISOPB5SPI1_MOSI…...

华为HG8546M光猫宽带密码破解

首先进光猫管理界面 将password改成text就可以看到加密后的密码了 复制密码到下面代码里 import hashlibdef sha256(todo):return hashlib.sha256(str(todo).encode()).hexdigest()def md5(todo):return hashlib.md5(str(todo).encode()).hexdigest()def find_secret(secret,…...

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中&#xff0c;container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见&#xff0c;特别 是在设备驱动模型中。linux内核的主要开发语言是C&#xff0c;但是现在内核的框架使用了非常多的面向…...

UE5 检测球形范围的所有Actor

和Untiiy不同&#xff0c;不需要复杂的调用 首选确保角色添加了Sphere Collision 然后直接把sphere拖入蓝图&#xff0c;调用GetOverlappingActors来获取碰撞范围内的所有Actor...

AI大模型学习十:‌Ubuntu 22.04.5 调整根目录大小,解决根目录磁盘不够问题

一、说明 由于默认安装时导致home和根目录大小一样&#xff0c;导致根目录不够&#xff0c;所以我们调整下 二、调整 # 确认/home和/是否为独立逻辑卷&#xff0c;并属于同一卷组&#xff08;VG&#xff09; rootnode1:~# lsblk NAME MAJ:MIN RM SIZE…...

在ros2上使用opencv显示一张图片

1.先将图片放到桌面上 2.打开终端ctrlaltT&#xff0c;查看自己是否已安装opencv 3.创建工作环境 4.进入工作目录并创建ROS2包添加OpenCV依赖项 5.进入/home/kong/opencv_ws/opencv_use/src目录创建.cpp文件并编辑 6.代码如下 my_opencv.cpp #include <cstdio> #include…...

训练神经网络的原理(前向传播、反向传播、优化、迭代)

训练神经网络的原理 通过前向传播计算预测值和损失&#xff0c;利用反向传播计算梯度&#xff0c;然后通过优化算法更新参数&#xff0c;最终使模型在给定任务上表现更好。 核心&#xff1a;通过计算损失函数&#xff08;通常是模型预测与真实值之间的差距&#xff09;对模型参…...

每日一题(小白)暴力娱乐篇30

顺时针旋转&#xff0c;从上图中不难看出行列进行了变换。因为这是一道暴力可以解决的问题&#xff0c;我们直接尝试使用行列转换看能不能得到想要的结果。 public static void main(String[] args) {Scanner scan new Scanner(System.in);int nscan.nextInt();int mscan.next…...

【HTTPS】免费SSL证书配置Let‘s Encrypt自动续期

【HTTPS】免费SSL证书配置Lets Encrypt自动续期 1. 安装Certbot1.1 snapd1.2 certbot2. 申请泛域名证书使用 DNS 验证申请泛域名证书3.配置nginx申请的 SSL 证书文件所在目录nginx配置证书示例查看证书信息和剩余时间4.自动续期手动自动5.不同服务器使用1. 安装Certbot 1.1 sn…...

企业应如何防范 AI 驱动的网络安全威胁?

互联网技术和 AI 科技为世界开启了一个新的发展篇章。同时&#xff0c;网络攻击也呈现出愈发强势的发展势头&#xff1a;高级持续性威胁 &#xff08;APT&#xff1a;Advanced Persistent Threat&#xff09;组织采用新的战术、技术和程序 (TTP)、AI 驱动下攻击数量和速度的提高…...

决策树简介

【理解】决策树例子 决策树算法是一种监督学习算法&#xff0c;英文是Decision tree。 决策树思想的来源非常朴素&#xff0c;试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff0c;这其中的if表示的是条件&#xff0c;if之后的else就是一种选择或决策。程序设计中的…...

ScrollView(滚动视图)详解和按钮点击事件

文章目录 **ScrollView&#xff08;滚动视图&#xff09;详解****1. 核心特性****2. 基本用法****XML 示例&#xff1a;简单滚动布局** **3. 水平滚动&#xff1a;HorizontalScrollView****4. 高级用法****(1) 嵌套滚动控件****(2) 动态添加内容****(3) 监听滚动事件** **5. 注…...

2025年3月,再上中科院1区TOP,“等级熵+状态识别、故障诊断”

引言 2025年3月&#xff0c;研究者在国际机械领域顶级期刊《Mechanical Systems and Signal Processing》&#xff08;JCR 1区&#xff0c;中科院1区 Top&#xff0c;IF&#xff1a;7.9&#xff09;上以“Rating entropy and its multivariate version”为题发表科学研究成果。…...

根据pdf文档生成问答并进行评估

目标是根据pdf文档生成问答&#xff0c;并进行评估。 首先&#xff0c;安装依赖 pip install PyPDF2 pandas tqdm openai -q 具体过程如下&#xff1a; 1、将pdf放在opeai_blog_pdfs目录下&#xff0c;引用依赖 2、上传pdf文件&#xff0c;创建向量库 3、单个提问的向量检索…...

计算机网络 - 四次挥手相关问题

通过一些问题来讨论 TCP 的四次挥手断开连接 说一下四次挥手的过程&#xff1f;为什么需要四次呢&#xff1f;time-wait干嘛的&#xff0c;close-wait干嘛的&#xff0c;在哪一个阶段&#xff1f;状态CLOSE_WAIT在什么时候转换成下一个状态呢&#xff1f;为什么 TIME-WAIT 状态…...

SLAM | 两组时间戳不同但同时开始的imu如何对齐

场景&#xff1a; 两个手机在支架上&#xff0c;同时开始采集数据 需求&#xff1a; 对齐两个数据集的imu数据 做到A图片 B imu 做法&#xff1a; 取出来两组imu数据到excel表中&#xff0c;画图 A组 B组&#xff1a; x轴 &#xff1a; 所有imu的时间戳减去第一个时间…...

code review时线程池的使用

一、多线程的作用 多个任务并行执行可以提升效率异步&#xff0c;让与主业务无关的逻辑异步执行&#xff0c;不阻塞主业务 二、问题描述 insertSelective()方法是一个并发度比较高的业务&#xff0c;主要是插入task到任务表里&#xff0c;新建task&#xff0c;并且insertSele…...

物流网络暗战升级DHL新布局将如何影响eBay卖家库存分布策略?

物流网络暗战升级&#xff1a;DHL新布局将如何影响eBay卖家库存分布策略&#xff1f; 跨境电商发展迅猛&#xff0c;卖家对物流的依赖程度不言而喻。尤其是平台型卖家&#xff0c;例如在eBay上经营多站点的卖家&#xff0c;物流成本和时效几乎直接决定了利润空间与客户满意度。…...

JAMA Netw. Open:机器学习解码大脑:精准预测PTSD症状新突破

创伤后应激障碍&#xff08;PTSD&#xff09;是一种常见的心理健康状况&#xff0c;它可以在人们经历或目睹创伤性事件&#xff08;如战争、严重事故、自然灾害、暴力攻击等&#xff09;后发展。PTSD的症状可能包括 flashbacks&#xff08;闪回&#xff09;、噩梦、严重的焦虑、…...

域控制器升级的先决条件验证失败,证书服务器已安装

出现“证书服务器已安装”导致域控制器升级失败时&#xff0c;核心解决方法是卸载已安装的证书服务‌。具体操作如下&#xff1a;‌ ‌卸载证书服务‌ 以管理员身份打开PowerShell&#xff0c;执行命令&#xff1a; Remove-WindowsFeature -Name AD-Certificate该命令会移除A…...

Node.js入门

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;50&#xff09;【✔️】前端工程…...

使用CubeMX新建EXTI外部中断工程——不使用回调函数

具体的使用CubeMX新建工程的步骤看这里&#xff1a;STM32CubeMX学习笔记&#xff08;3&#xff09;——EXTI(外部中断)接口使用_cubemx exti-CSDN博客 之前一直都是在看野火的视频没有亲手使用CubeMX生成工程&#xff0c;而且野火给的例程代码框架和自动生成的框架也不一样&…...

Verilog的整数除法

1、可变系数除法实现----利用除法的本质 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2025/04/15 13:45:39 // Design Name: // Module Name: divide_1 // Project Name: // Target Devices: // Tool Versions: // Description: // // Depe…...

win32汇编环境,网络编程入门之十九

;win32汇编环境,网络编程入门之十九 ;在这一编程里&#xff0c;我们学习一下如何使用gethostbyname函数&#xff0c;也顺便学一下如何将C定义的函数在WIN32汇编环境中使用 ;先看一下官方解释&#xff1a;从主机数据库中检索与主机名对应的主机信息。 ;它的原理是从你的电脑DNS中…...

Java学习手册:Java线程安全与同步机制

在Java并发编程中&#xff0c;线程安全和同步机制是确保程序正确性和数据一致性的关键。当多个线程同时访问共享资源时&#xff0c;如果不加以控制&#xff0c;可能会导致数据不一致、竞态条件等问题。本文将深入探讨Java中的线程安全问题以及解决这些问题的同步机制。 线程安…...

在生信分析中,从生物学数据库中下载的序列存放在哪里?要不要建立一个小型数据库,或者存放在Gitee上?

李升伟 整理 在Galaxy平台中使用时&#xff0c;从NCBI等生物学数据库下载的DNA序列的存储位置和管理方式需要根据具体的工作流程和需求进行调整。以下是详细的分步说明和建议&#xff1a; 一、Galaxy中DNA序列的默认存储位置 在Galaxy的“历史记录”&#xff08;History&…...

Python异步编程入门:Async/Await实战详解

引言 在当今高并发的应用场景下&#xff0c;传统的同步编程模式逐渐暴露出性能瓶颈。Python通过asyncio模块和async/await语法为开发者提供了原生的异步编程支持。本文将手把手带你理解异步编程的核心概念&#xff0c;并通过实际代码案例演示如何用异步爬虫提升10倍效率&#…...

cmd 终端输出乱码问题 |Visual Studio 控制台输出中文乱码解决

在网上下载&#xff0c;或者移植别人的代码到自己的电脑&#xff0c;使用VS运行后&#xff0c;控制台输出中文可能出现乱码。这是因为源代码的编码格式和控制台的编码格式不一致。 文章目录 查看源代码文件编码格式查看输出控制台编码格式修改编码格式修改终端代码页 补充总结 …...

【算法】椭圆曲线签名(ECDSA)

&#x1f914;什么是椭圆曲线签名&#xff08;ECDSA&#xff09;&#xff1f; 椭圆曲线签名算法&#xff08;Elliptic Curve Digital Signature Algorithm&#xff0c;简称 ECDSA&#xff09;是一种基于 椭圆曲线密码学 的数字签名算法。它主要用于加密货币&#xff08;如 Bit…...

Linux下使用MTK的SP_Flash_tool刷机工具

MTK的SP_Flash_tool刷机工具安装流程如下&#xff1a; 1、解压SP_Flash_Tool_Linux_v5.1336.00.100_Customer.zip unzip SP_Flash_Tool_exe_Linux_64Bit_v5.1520.00.100.zip 2、首先安装 libusb-dev 这个包&#xff1a; sudo apt-get install libusb-dev 3、安装成功之后…...

FRP内网穿透代理两个web页面(多端口内网穿透)

内网机器代理两个web页面出来 下载frp 选择0.51.2版本下载&#xff0c;高版本测试为成功 frp下载地址 部署frp server端&#xff08;公网部署&#xff09; #上传到opt rootsdgs-server07:/opt# ll frp_0.51.2_linux_amd64.tar.gz -rw-r--r-- 1 root root 11981480 Apr 15 1…...

Jenkins插件下载慢解决办法

jenkins设置插件使用国内镜像_jenkins 国内镜像-CSDN博客 国内源 以下是一些常用的国内 Jenkins 插件更新源地址&#xff1a; 清华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json华为开源镜像站&#xff1a;https://mirrors.huawei…...

【Unity笔记】Unity开发笔记:ScriptableObject实现高效游戏配置管理(含源码解析)

在Unity开发中&#xff0c;高效管理游戏配置数据是提升开发效率的关键。本文分享如何使用ScriptableObject构建可编辑的键值对存储系统&#xff0c;并实现运行时动态读取。 一、为什么选择ScriptableObject&#xff1f; 1.1 ScriptableObject的核心优势 独立资源&#xff1a;…...

FPAG IP核调用小练习

一、调用步骤 1、打开Quartus 右上角搜索ROM&#xff0c;如图所示 2、点击后会弹出如图所示 其中文件路径需要选择你自己的 3、点击OK弹出如图所示 图中红色改为12与1024 4、然后一直点NEXT&#xff0c;直到下图 这里要选择后缀为 .mif的文件 5、用C语言生成 .mif文件 //…...

vue动画

1、动画实现 &#xff08;1&#xff09;、操作css的transition或animation &#xff08;2&#xff09;、在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名 &#xff08;3&#xff09;、过渡的相关类名&#xff1a; xxx-enter-active: 进入的时候激活…...

大数据学习(106)-hivesql函数

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

AI日报 - 2025年04月16日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; 模型井喷 | OpenAI (o3/o4-mini, GPT-4.1), Meta (Llama 4 Scout/Maverick), Z.ai (GLM-4家族), Cohere (Embed 4), Google (DolphinGemma) 等发布新模型&#xff0c;多模态、长文本、高效推理成焦点。 ▎&#x1f4bc; 商业…...

C# 经纬度坐标的精度及WGS84(谷歌)、GCJ02(高德)、BD09(百度)坐标相互转换(含高精度转换)

1. 概述 WGS-84坐标系&#xff08;World Geodetic System一1984 Coordinate System&#xff09;是一种国际上采用的地心坐标系&#xff0c;GCJ-02是由中国国家测绘局&#xff08;G表示Guojia国家&#xff0c;C表示Cehui测绘&#xff0c;J表示Ju局&#xff09;制订的地理信息系…...

案例:陌陌聊天数据分析

背景分析&#xff1a; 陌陌作为聊天平台每天都会有大量的用户在线&#xff0c;会出现大量的聊天数据&#xff0c;通过对 聊天数据的统计分析 &#xff0c;可以更好的 对用户构建精准的 用户画像 &#xff0c;为用户提供更好的服务以及实现 高 ROI 的平台运营推广&#xff…...

关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。

关闭谷歌浏览器&#xff08;Google Chrome&#xff09;的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。 1. 在 Windows 上关闭 Chrome 自动更新2. 在 macOS 上关闭 Chrome 自动更新3. 在 Linux 上关闭 Chrome 自动更新4. 注意事项1. 在 Windows 上关闭 Chro…...

进程(完)

今天我们就补充一个小的知识点,查看进程树命令,来结束我们对linux进程的学习,那么话不多说,来看. 查看进程树 pstree 基本语法&#xff1a; pstree [选项] 优点&#xff1a;可以更加直观的来查看进程信息 常用选项&#xff1a; -p&#xff1a;显示进程的pid -u&#xff…...

(劳特巴赫调试器学习笔记)四、Practice脚本.cmm文件编写

Lauterbach调试器 文章目录 Lauterbach调试器一、什么是Practice脚本文件二、cmm脚本使用示例总结 一、什么是Practice脚本文件 官方文档解释&#xff1a; 因为Practice脚本以cmm为后缀&#xff0c;所以大多数人叫它cmm脚本。 以tricore为例&#xff0c;在安装目录下&#xff…...

并行流parallelStream.map().collect()

一、使用场景 先贴代码 public static void main(String[] args) {List<String> stringList new ArrayList<>();List<Integer> integerList new ArrayList<>();int num 10000;for (int i 0;i<num;i){stringList.add(String.valueOf(i));}stri…...