【MCP Node.js SDK 全栈进阶指南】高级篇(3):MCP 安全体系建设
背景
随着MCP协议在企业和个人应用中的广泛采用,安全性已成为MCP系统设计和开发中不可忽视的核心要素。一个健壮的MCP安全体系不仅能保护敏感数据和用户隐私,还能确保AI模型与外部工具交互的可靠性和完整性。本文将深入探讨MCP TypeScript-SDK的安全体系建设,帮助开发者构建既强大又安全的MCP应用。
1. 威胁模型与风险评估
1.1 MCP应用面临的安全威胁
MCP应用作为连接AI模型与外部工具的桥梁,面临着多方面的安全威胁。了解这些威胁是构建安全体系的第一步:
1.1.1 外部攻击威胁
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 恶意用户 │────▶│ MCP 系统 │────▶│ 外部资源/工具 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘│ ▲ ││ │ │└───────────────────────┴───────────────────────┘攻击路径
-
恶意输入注入:攻击者可能通过向MCP系统提交恶意构造的输入,尝试操纵AI模型或后端工具。
-
身份冒充:未经授权的用户可能尝试伪装为合法用户访问MCP服务。
-
中间人攻击:在客户端与服务器之间截获或篡改通信内容。
-
拒绝服务攻击:通过大量请求使MCP服务器资源耗尽,导致服务不可用。
1.1.2 内部安全威胁
-
权限滥用:具有合法访问权限的用户可能滥用其权限获取敏感数据。
-
数据泄露:内部人员可能有意或无意地暴露敏感信息。
-
配置错误:错误的安全配置可能导致不必要的系统暴露。
1.1.3 工具集成风险
MCP的核心价值在于连接AI模型与外部工具,这也带来了独特的安全风险:
-
工具能力滥用:恶意用户可能尝试使用MCP提供的工具执行未授权操作。
-
工具链污染:第三方工具可能包含恶意代码或漏洞。
-
数据流转风险:敏感数据在多个工具间流转时面临泄露风险。
1.2 风险评估方法论
对MCP系统进行全面的风险评估,可采用以下方法论:
1.2.1 STRIDE威胁建模
STRIDE是一种常用的威胁建模方法,特别适用于MCP这类复杂系统:
威胁类型 | 描述 | MCP相关示例 |
---|---|---|
欺骗(Spoofing) | 冒充他人身份 | 攻击者冒充管理员访问MCP管理界面 |
篡改(Tampering) | 修改系统数据 | 修改MCP资源定义或工具参数 |
否认(Repudiation) | 否认曾执行的操作 | 用户否认曾使用MCP工具执行某操作 |
信息泄露(Information Disclosure) | 未授权访问信息 | 获取MCP处理的敏感数据 |
拒绝服务(Denial of Service) | 使服务不可用 | 通过大量请求使MCP服务器崩溃 |
权限提升(Elevation of Privilege) | 获取未授权的权限 | 从普通用户提升为MCP管理员 |
1.2.2 风险评分矩阵
使用风险评分矩阵可以量化各种威胁的风险级别:
// 风险评估辅助函数
function assessRisk(threat: string,likelihood: 1 | 2 | 3, // 1=低, 2=中, 3=高impact: 1 | 2 | 3 // 1=低, 2=中, 3=高
): { threat: string; risk: string; score: number } {const score = likelihood * impact;let risk = "低";if (score >= 7) risk = "高";else if (score >= 4) risk = "中";return { threat, risk, score };
}// 使用示例
const mcpRiskMatrix = [assessRisk("未授权工具访问", 3, 3), // 高风险assessRisk("配置文件泄露", 2, 3), // 中风险assessRisk("日志信息泄露", 2, 1) // 低风险
];
1.3 安全优先级确定
基于风险评估结果,可以建立MCP系统的安全优先级框架:
1.3.1 关键安全领域排序
const securityPriorities = [{area: "身份验证与授权",priority: "高",rationale: "直接影响谁可以访问MCP系统及其功能"},{area: "工具API安全",priority: "高",rationale: "防止工具被滥用执行未授权操作"},{area: "数据传输加密",priority: "高",rationale: "保护传输中的敏感信息不被截获"},{area: "输入验证",priority: "中",rationale: "防止注入攻击和不合法输入"},{area: "错误处理与日志",priority: "中",rationale: "确保安全事件可被检测和回溯"},{area: "依赖项安全",priority: "中",rationale: "减轻第三方库引入的风险"}
];
1.3.2 制定安全规划路线图
根据安全优先级,可以制定分阶段的安全实施路线图:
- 基础安全阶段:实现必要的身份验证、加密和输入验证
- 增强安全阶段:添加细粒度访问控制、异常检测和安全审计
- 高级安全阶段:实施高级威胁防护、自动化安全测试和持续监控
1.4 典型攻击场景分析
以下是MCP系统可能面临的典型攻击场景及其防御策略:
1.4.1 工具命令注入攻击
攻击场景:攻击者构造恶意输入,尝试在工具执行上下文中注入命令。
// 易受攻击的工具实现
const vulnerableFileTool = {name: "readFile",description: "读取文件内容",parameters: {path: { type: "string", description: "文件路径" }},handler: async ({ path }) => {// 危险: 直接使用用户输入而不验证const command = `cat ${path}`;return executeCommand(command); // 可能遭受命令注入}
};// 防御示例
const secureFileTool = {name: "readFile",description: "读取文件内容",parameters: {path: { type: "string", description: "文件路径" }},handler: async ({ path }) => {// 验证输入是否为安全的文件路径if (!isValidFilePath(path)) {throw new Error("无效的文件路径");}// 使用安全的文件读取API而非命令执行return fs.promises.readFile(path, 'utf-8');}
};function isValidFilePath(path: string): boolean {// 实现路径验证逻辑return /^[a-zA-Z0-9_\-\/\.]+$/.test(path) && !path.includes('..');
}
1.4.2 权限逃逸攻击
攻击场景:攻击者尝试绕过访问控制,获取未授权的资源。
// 易受攻击的实现
app.get('/api/mcp/resources/:resourceId', async (req, res) => {const { resourceId } = req.params;// 危险: 未检查用户是否有权访问该资源const resource = await getResource(resourceId);res.json(resource);
});// 防御示例
app.get('/api/mcp/resources/:resourceId', async (req, res) => {const { resourceId } = req.params;const userId = getUserIdFromToken(req.headers.authorization);// 先检查权限if (!await hasAccessToResource(userId, resourceId)) {return res.status(403).json({ error: '无权访问此资源' });}const resource = await getResource(resourceId);res.json(resource);
});
1.4.3 中间人攻击
攻击场景:攻击者截获MCP客户端与服务器之间的通信。
防御策略:
- 始终使用TLS加密通信
- 实现证书验证
- 考虑使用HTTP严格传输安全(HSTS)
import https from 'https';
import fs from 'fs';
import express from 'express';const app = express();// HTTPS服务器配置
const httpsOptions = {key: fs.readFileSync('server.key'),cert: fs.readFileSync('server.cert'),// 强制使用现代TLS版本minVersion: 'TLSv1.2'
};// 设置HSTS头
app.use((req, res, next) => {res.setHeader('Strict-Transport-Security','max-age=31536000; includeSubDomains; preload');next();
});// 创建HTTPS服务器
https.createServer(httpsOptions, app).listen(443, () => {console.log('MCP服务器在HTTPS端口443上启动');
});
通过深入分析MCP应用面临的威胁模型并进行全面风险评估,开发者可以有的放矢地构建安全体系,为后续的安全实施奠定坚实基础。
2. 数据加密与传输安全
MCP系统处理的数据可能包含敏感信息,保护这些数据的安全至关重要。本节将探讨如何在MCP应用中实现数据加密与传输安全。
2.1 通信层加密实现
MCP应用需要确保客户端与服务器之间的所有通信都经过加密,防止数据在传输过程中被窃取或篡改。
2.1.1 TLS/SSL配置
在MCP服务器中实现TLS加密:
import { McpServer } from '@modelcontextprotocol/typescript-sdk';
import https from 'https';
import fs from 'fs';// 读取TLS证书
const options = {key: fs.readFileSync('private-key.pem'),cert: fs.readFileSync('certificate.pem'),// 推荐的TLS安全配置ciphers: 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256',minVersion: 'TLSv1.2',// 可选:要求客户端证书进行双向TLS认证requestCert: false,rejectUnauthorized: false
};// 创建HTTPS服务器
const httpsServer = https.createServer(options);// 配置MCP服务器使用HTTPS
const mcpServer = new McpServer({transport: {type: 'http',server: httpsServer}
});httpsServer.listen(443, () => {console.log('MCP HTTPS服务器启动在端口443');
});
2.1.2 客户端连接安全
MCP客户端在连接服务器时应验证TLS证书:
import { McpClient } from '@modelcontextprotocol/typescript-sdk';
import https from 'https';
import fs from 'fs';// 创建安全的HTTPS代理
const httpsAgent = new https.Agent({// 可信CA证书列表,用于验证服务器证书ca: fs.readFileSync('trusted-ca.pem'),// 检查服务器名称是否与证书匹配checkServerIdentity: (host, cert) => {// 实现证书验证逻辑if (!cert.subject.CN.includes(host)) {return new Error('证书CN不匹配目标主机');}return undefined; // 验证通过},// 可选:客户端证书(双向TLS)key: fs.readFileSync('client-key.pem'),cert: fs.readFileSync('client-cert.pem')
});// 配置客户端使用安全连接
const client = new McpClient({url: 'https://mcp-server.example.com',httpsAgent
});
2.2 敏感数据存储加密
除了传输安全,MCP应用还需要保护存储中的敏感数据。
2.2.1 配置文件加密
敏感配置(如API密钥)应加密存储:
import crypto from 'crypto';
import fs from 'fs';// 加密配置数据
function encryptConfig(configData: any, masterKey: Buffer): string {// 生成随机初始化向量const iv = crypto.randomBytes(16);// 创建加密器const cipher = crypto.createCipheriv('aes-256-gcm', masterKey, iv);// 加密数据let encrypted = cipher.update(JSON.stringify(configData), 'utf8', 'hex');encrypted += cipher.final('hex');// 获取认证标签const authTag = cipher.getAuthTag();// 组合IV、认证标签和加密数据return JSON.stringify({iv: iv.toString('hex'),authTag: authTag.toString('hex'),encryptedData: encrypted});
}// 解密配置数据
function decryptConfig(encryptedString: string, masterKey: Buffer): any {const encryptedObj = JSON.parse(encryptedString);// 从存储的格式中提取组件const iv = Buffer.from(encryptedObj.iv, 'hex');const authTag = Buffer.from(encryptedObj.authTag, 'hex');const encryptedData = encryptedObj.encryptedData;// 创建解密器const decipher = crypto.createDecipheriv('aes-256-gcm', masterKey, iv);decipher.setAuthTag(authTag);// 解密数据let decrypted = decipher.update(encryptedData, 'hex', 'utf8');decrypted += decipher.final('utf8');return JSON.parse(decrypted);
}// 使用示例
const masterKey = crypto.scryptSync('强密码', '盐值', 32); // 安全地生成密钥// 存储加密配置
const config = {apiKey: 'super-secret-api-key',userCredentials: {username: 'admin',password: 'secret-password'}
};const encryptedConfig = encryptConfig(config, masterKey);
fs.writeFileSync('config.encrypted', encryptedConfig);// 读取并解密配置
const storedConfig = fs.readFileSync('config.encrypted', 'utf8');
const decryptedConfig = decryptConfig(storedConfig, masterKey);
2.2.2 会话数据加密
MCP会话数据的安全存储:
import { McpServer } from '@modelcontextprotocol/typescript-sdk';
import crypto from 'crypto';// 加密会话存储实现
class EncryptedSessionStore {private encryptionKey: Buffer;private sessions: Map<string, string> = new Map();constructor(encryptionKey: Buffer) {this.encryptionKey = encryptionKey;}// 存储加密会话async saveSession(sessionId: string, sessionData: any): Promise<void> {const encrypted = this.encryptData(JSON.stringify(sessionData));this.sessions.set(sessionId, encrypted);}// 获取并解密会话async getSession(sessionId: string): Promise<any | null> {const encrypted = this.sessions.get(sessionId);if (!encrypted) return null;try {const decrypted = this.decryptData(encrypted);return JSON.parse(decrypted);} catch (error) {console.error('会话解密失败:', error);return null;}}// 删除会话async deleteSession(sessionId: string): Promise<void> {this.sessions.delete(sessionId);}// 加密数据private encryptData(data: string): string {const iv = crypto.randomBytes(16);const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv);let encrypted = cipher.update(data, 'utf8', 'hex');encrypted += cipher.final('hex');const authTag = cipher.getAuthTag();return JSON.stringify({iv: iv.toString('hex'),authTag: authTag.toString('hex'),data: encrypted});}// 解密数据private decryptData(encryptedJson: string): string {const { iv, authTag, data } = JSON.parse(encryptedJson);const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, Buffer.from(iv, 'hex'));decipher.setAuthTag(Buffer.from(authTag, 'hex'));let decrypted = decipher.update(data, 'hex', 'utf8');decrypted += decipher.final('utf8');return decrypted;}
}// 生成安全的加密密钥
const sessionKey = crypto.randomBytes(32);
const sessionStore = new EncryptedSessionStore(sessionKey);// 在MCP服务器中使用加密会话存储
const server = new McpServer({sessionStorage: {async save(sessionId, data) {await sessionStore.saveSession(sessionId, data);},async load(sessionId) {return sessionStore.getSession(sessionId);},async delete(sessionId) {await sessionStore.deleteSession(sessionId);}}
});
2.3 密钥管理最佳实践
有效的密钥管理是数据加密安全性的关键。
2.3.1 密钥轮换机制
实现定期密钥轮换以提高安全性:
import crypto from 'crypto';class KeyRotationManager {private currentKey: Buffer;private previousKeys: Map<string, Buffer> = new Map();private keyLifetimeMs: number;private currentKeyId: string;constructor(keyLifetimeMs: number = 7 * 24 * 60 * 60 * 1000) { // 默认7天this.keyLifetimeMs = keyLifetimeMs;// 生成初始密钥this.currentKeyId = this.generateKeyId();this.currentKey = crypto.randomBytes(32);// 设置定期轮换setInterval(() => this.rotateKey(), this.keyLifetimeMs);}private generateKeyId(): string {return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);}private rotateKey(): void {// 保存当前密钥this.previousKeys.set(this.currentKeyId, this.currentKey);// 生成新密钥this.currentKeyId = this.generateKeyId();this.currentKey = crypto.randomBytes(32);// 移除过期密钥(保留最近的5个密钥)const keyIds = Array.from(this.previousKeys.keys());if (keyIds.length > 5) {const oldestKeyId = keyIds[0];this.previousKeys.delete(oldestKeyId);}console.log(`密钥已轮换,新密钥ID: ${this.currentKeyId}`
相关文章:
【MCP Node.js SDK 全栈进阶指南】高级篇(3):MCP 安全体系建设
背景 随着MCP协议在企业和个人应用中的广泛采用,安全性已成为MCP系统设计和开发中不可忽视的核心要素。一个健壮的MCP安全体系不仅能保护敏感数据和用户隐私,还能确保AI模型与外部工具交互的可靠性和完整性。本文将深入探讨MCP TypeScript-SDK的安全体系建设,帮助开发者构建…...
C++智能指针
智能指针是C中用于自动管理动态分配内存的类模板,它们通过在适当的时机自动释放内存来帮助防止内存泄漏。C11引入了以下几种主要的智能指针: 1. std::unique_ptr 独占所有权的智能指针,同一时间只能有一个unique_ptr指向特定对象。 #inclu…...
基于STM32、HAL库的ATECC608B安全验证及加密芯片驱动程序设计
一、简介: ATECC608B是Microchip公司生产的一款安全加密芯片,提供以下主要特性: 基于硬件的高安全性加密算法 ECC P-256加密引擎 SHA-256哈希算法 AES-128加密 真随机数生成器(TRNG) 16KB安全存储空间 IC接口(最高1MHz) 低功耗设计,适合物联网应用 二、硬件接口: ATECC60…...
【安全扫描器原理】ICMP扫描
【安全扫描器原理】ICMP扫描 1.ICMP协议概述2.ping命令3.tracert命令4.ICMP通信实例5.ICMP协议内容6.ICMP扫描的安全性7.ICMP扫描器的原理及优化策略1.ICMP协议概述 ICMP是TCP/IP协议族中的一个重要协议,主要用于在IP主机之间、主机和路由器之间传递控制消息,这些控制消息包…...
前端 AI 开发实战:基于自定义工具类的大语言模型与语音识别调用指南
在人工智能技术快速发展的今天,将大语言模型(LLM)和语音识别(ASR)功能集成到前端应用中,已经成为提升用户体验、打造智能化应用的重要手段。本文将结合一段实际的 AI 工具类代码,详细讲解如何在…...
组件轮播与样式结构重用实验
任务一:使用“Swiper 轮播组件”对自行选择的图片和文本素材分别进行轮播,且调整对应的“loop”、“autoPlay”“interval”、“vertical”属性,实现不同的轮播效果,使用Swiper 样式自定义,修改默认小圆点和被选中小圆…...
(计数)洛谷 P8386 PA2021 Od deski do deski/P10375 AHOI2024 计数 题解
题意 给定 n n n, m m m,求满足以下限制的长度为 n n n 的序列数目: 每个元素在 [ 1 , m ] [1,m] [1,m] 之间;一次操作定义为删除一个长度至少为 2 2 2 且区间两端相等的区间,该序列需要在若干次操作内被删空。 …...
基于C++数据结构双向循环链表实现的贪吃蛇
大二上数据结构I-课程设计 1.设计思路 建模:程序界面是一个二维平面图蛇:蛇的身体可以看作是链表的节点,当蛇吃到食物时,就增加一节链表节点食物:相应地在边界内随机生成蛇的移动:取得上下左右键的ASCII码…...
H3C ER3208G3路由实现内网机器通过公网固定IP访问内网服务器
内网机器可以通过内网访问服务器;公网机器可以通过公网固定IP访问服务器;但内网机器无法通过公网固定IP访问内网服务器;想实现内网机器通过公网固定IP访问内网服务器 WEB登录管理后台,网络设置->NAT配置,选“高级配…...
Vue3+Three JS高德地图自定义经纬度实现围栏
Vue3实现代码 index.html需要引入three.js <script src"https://cdn.jsdelivr.net/npm/three0.142/build/three.js"></script> 围栏组件 <template><div id"mapContainer" ref"mapContainer"></div> </templ…...
远程访问你的家庭NAS服务器:OpenMediaVault内网穿透配置教程
文章目录 前言1. OMV安装Cpolar工具2. 配置OMV远程访问地址3. 远程访问OMV管理界面4. 固定远程访问地址 前言 在这个数据爆炸的时代,无论是管理家人的照片和视频,还是企业老板处理财务报表和技术文档,高效的数据管理和便捷的文件共享已经变得…...
4.2.3 MYSQL事务原理分析
文章目录 4.2.3 MYSQL事务原理分析1. 事务1. 前提:并发连接访问2. 事务定义3. 事务语句:4. acid特性5. undolog-回滚日志6. redolog-重做日志 2. 隔离级别1. 四种隔离级别2. 并发问题解释3. 隔离级别设置 3. MVCC(Multiversion Concurrency Control&…...
极狐GitLab 如何使用文件导出迁移项目和群组?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 用文件导出迁移项目和群组 (FREE ALL) 推荐使用 直接传输 迁移群组和项目。然而,在某些情况下,您可能…...
Linux/AndroidOS中进程间的通信线程间的同步 - 管道和FIFO
前言 管道是 UNIX 系统上最古老的 IPC 方法,它在 20 世纪 70 年代早期 UNIX 的第三个版本上就出现了。管道为一个常见需求提供了一个优雅的解决方案:给定两个运行不同程序的进程,在 shell 中如何让一个进程的输出作为另一个进程的输入呢&…...
第十六届蓝桥杯 2025 C/C++组 破解信息
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P12344 [蓝桥杯 2025 省 B/Python B 第二场] 破解信息…...
[FPGA Video IP] VDMA
Xilinx AXI Video Direct Memory Access IP (PG020) 详细介绍 概述 Xilinx AXI Video Direct Memory Access (AXI VDMA) LogiCORE™ IP 核(PG020)是一个软核 IP,专为视频应用设计,提供在内存与 AXI4-Stream 视频外设之间的高带宽…...
Ubuntu如何查看硬盘的使用情况,以及挂载情况。
在Ubuntu中查看硬盘使用情况及挂载情况,可通过以下命令实现: 一、查看硬盘使用情况 df -h 显示所有挂载文件系统的磁盘空间使用情况(含总容量、已用空间、可用空间等),输出结果以易读格式(如GB、MB&#x…...
第十六届蓝桥杯 2025 C/C++组 脉冲强度之和
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P12338 [蓝桥杯 2025 省 B/Python B 第二场] 脉冲强度…...
23种设计模式-行为型模式之中介者模式(Java版本)
Java 中介者模式(Mediator Pattern)详解 🧠 什么是中介者模式? 中介者模式是一种行为型设计模式,它通过定义一个中介者对象来封装一组对象之间的交互。中介者使得各个对象不需要显式地知道彼此之间的关系,…...
集群与存储-lvs-nat实验
一、实验目的 1、熟练掌握ipvsadm 指令的使用 2、理解lvs 负载均衡的原理 3. 熟练掌握lvs-netnfs的配置 二、实验内容 1.拓扑图 2.实验步骤 #在节点服务器中添加网卡,选择仅主机模式 #查看网卡 #启用网卡 nmcli device up ens224 ip a #修改虚拟地址的网关 #…...
Android——Serializable和Parcelable
在Android中传递对象的方式 在 Android 开发中,Parcelable 和 Serializable 是两种用于对象序列化的接口 Serializable public class Student implements Serializable {public int id;public String name;public int age;public Student(int id, String name, i…...
python:sklearn 决策树(Decision Tree)
5. 决策树(Decision Tree) - 第5章 算法思想:基于信息增益(ID3)或基尼不纯度(CART)递归划分特征。 编写 test_dtree_1.py 如下 # -*- coding: utf-8 -*- """ 5. 决策树&…...
0-1背包难题哪家强:回溯法 VS 动态规划 VS 贪心算法
回溯法、动态规划和贪心算法是三种常见的算法设计思想,他们都可以用来解决0-1背包问题,但它们在解决问题的思路、适用条件和效率上存在显著差异。以下从多个维度进行对比分析: 相关系列文章链接: 《贪心算法 vs 动态规划:“急性子…...
JavaSE第12篇:接口interface
一、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings(ignore) import ssl ssl._create_default_https_con…...
一文掌握 npm 基础与常用指令
初学前端?npm 常用指令不熟?想了解 pnpm、yarn、cnpm 有什么不同? 这篇文章将带你从入门到精通,全面掌握 npm 的使用方法,以及选择适合自己项目的包管理工具! 文章目录 一、什么是 npm?二、npm …...
OpenObserve API Usage Guide for Log Management
OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目标 本文档旨在详细介绍 OpenObserve 的 API 使用方法,帮助用户通过 API 实现日志管理功能,包括日志摄入、查询、模糊匹配(类似 SQL 的 LIKE)、stream 管理…...
机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM)
机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM) 内容概要 第5章深入介绍了支持向量机(SVM),这是一种功能强大且应用广泛的机器学习模型。SVM适用于线性或非线性分类、回归以及 novelty detection。本章详…...
CSRF(cross-site request forgery)跨域请求访问
CSRF 当我们在成功登录一个网站后,会将后端返回的cookie数据进行存放,每一次访问该域名都会将cookie存放在请求头,也就相当于用户登录凭证, 但这种同域自动携带cookie存在一种问题 那就是当恶意网站也进去请求时,同样…...
Kafka的Rebalance机制可能引发什么问题?如何优化?怎么减少不必要的Rebalance
Rebalance机制的核心目的是确保每个消费者都能处理适当数量的分区,以实现负载均衡和高可用性。 一般是消费者组发生变化的时候,比如订阅主题,消费者数量等等发生变化,可能会导致rebalance,rebalance会导致消费者组短时…...
【和春笋一起学C++】函数——C++的编程模块
目录 1. 原型句法 2. 函数分类 3. 函数参数之按值传递 4. 数组作为函数参数 在C中,要使用函数,必须要有这三个方面: 函数原型,函数原型描述了函数到编译器的接口,函数原型一般放在include文件中。函数原型告诉编译…...
Java高频面试之并发编程-11
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:父子线程如何共享数据? 在Java中,父子线程共享数据可以通过以下几种方式实现,具体…...
LangChain入门(四) 部署应用程序
1、使用LangServe部署应用程序 安装langserve pip install langserve[all] 代码示例 from fastapi import FastAPI from langchain.chat_models import init_chat_model from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.output_parser…...
精益数据分析(31/126):电商关键指标深度解析与实战策略
精益数据分析(31/126):电商关键指标深度解析与实战策略 在创业和数据分析的探索之路上,每一次深入学习都像是解锁了新的技能,让我们离成功更近一步。今天,我依旧带着和大家共同进步的想法,深入…...
【MongoDB篇】MongoDB的集合操作!
目录 引言第一节:集合的“诞生”——自动出现还是手动打造?🤔第二节:集合的“查阅”——看看这个数据库里有哪些柜子?📂👀第三节:集合的“重命名”——给文件柜换个名字!…...
antd中的表格穿梭框(Transfer)如何使用
穿梭框是什么?怎么使用? 需求如下: 有一组端口需要分配给具体接口 功能要求: 1. 需要展示当前端口名称及其所属的接口 2. 需支持搜索功能可对端口名或接口名进行筛选便于分配 3. 分配端口时,需检测当前接口内的端口是否满足此接口最低要求 4. 提供Select下拉框,可供查…...
联邦学习与安全多方计算的结合是隐私保护机器学习领域
联邦学习(Federated Learning, FL)与安全多方计算(Secure Multi-Party Computation, MPC)的结合是隐私保护机器学习领域的前沿方向,其框架设计需兼顾计算效率、安全性和可扩展性。以下是结合两者的框架设计与实现流程的详细解析: 一、框架设计核心目标 隐私保护:确保多…...
mongoose的介绍,连接数据库
Mongoose 是一个基于 Node.js 的 MongoDB ODM(Object Data Modeling)库,用于在 MongoDB 和 Node.js 应用之间提供结构化的模型层,帮助你更优雅、安全地操作数据库。 🧾 一、Mongoose 简介 📦 功能ÿ…...
Pytest中的fixture装饰器详解
pytest是Python生态中最流行的自动化测试框架,它通过简洁的语法、强大的功能(如fixture、参数化、插件扩展等)和丰富的插件生态,帮助开发者高效完成单元测试、集成测试和端到端测试。fixture是pytest框架中最核心、最强大的功能之一,它提供了…...
Linux系统配置JDK
目录 一、xftp传输JDK包 1、新建xftp会话并连接到我们的服务器 2、上传jdk包 二、配置环境变量 为了方便javaweb项目的建立,我们需要在搭建好的linux环境下配置安装JDK环境 一、xftp传输JDK包 因为jdk包文件比较大了,这时候不能使用简单的linux上传…...
通义千问最新一代大语言模型Qwen3发布了
通义千问Qwen3全面解析:最强开源大模型Ollama本地运行实战 🔥 最新重大好消息! 经过漫长的等待,今天凌晨阿里云正式发布了Qwen3大语言模型!本次更新带来了0.6b 1.7b 4b 8b 14b 30b 32b 235b超大参数模型,更…...
想做博闻强记的自己
2025年4月29日,13~25℃,还好 待办: 冶金《物理》期末测试 阅卷(冶金《物理》期末测试试卷) 重修《物理》《物理2》电子材料归档 规则变更,《高等数学2》期末试卷推倒重来 遇见:直播画面。 感受…...
爱普生SG2520HHN晶振数据中心服务器的理想解决方案
在当今数字化时代,数据中心作为海量数据存储、处理与传输的核心枢纽,其服务器的高效稳定运行至关重要。服务器作为其核心设备,对时钟信号的精度和稳定性提出了严苛要求——微小的时序误差可能导致数据传输失败或系统宕机。爱普生 SG2520HHN 差…...
【Prometheus-MySQL Exporter安装配置指南,开机自启】
目录 1. 创建 MySQL 监控用户2. 配置 MySQL 认证文件3. 安装 mysqld_exporter4. 配置 Systemd 服务5. 启动并验证服务6. 修改Prometheus配置常见错误排查错误现象排查步骤 6. 验证监控数据关键注意事项 1. 创建 MySQL 监控用户 mysql -uroot -p123456 # 登录MySQL-- 1. 创建监…...
Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 确定当前系统使用的哪种命令用来启动服务 SysV init 或者 systemd 使用下面的命令: ps -p 1例如,输出: PID TTY TIME CMD1 ? 00:00:02 systemdSysV init service命令用于对系统…...
P1494 [国家集训队] 小 Z 的袜子 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 q q q 次查询,每次查询给定 ( l , r ) (l,r) (l,r). 你需要求出 2 ∑ i ≤ i < j ≤ r [ a i a j ] ( r − l ) ( r − l 1 ) \dfrac{2\sum…...
(开源)视频画面增强模型:Ev-DeblurVSR (可以解决视频画面不清晰的问题)
在计算机视觉领域,模糊视频超分辨率(BVSR)是一个复杂且具有挑战性的任务,目标是从低分辨率(LR)和模糊的输入生成高分辨率(HR)视频。传统方法常常因缺乏足够运动信息和高频细节而表现…...
探索豆包WEB/PC超能创意1.0:创意新利器的全面解析
在当今数字化创意蓬勃发展的时代,新工具不断涌现,为创作者们带来了更多的可能性。豆包WEB/PC超能创意1.0便是其中一款备受瞩目的产品,它的出现为创意工作者和爱好者们打开了一扇充满无限可能的大门。 一、体验信息:探索创意新领域…...
五、UI自动化测试05--PyTest框架
目录 一、PyTest 框架2. 特点2. 安装步骤3. 基本使⽤3.1 测试函数形式3.2 执⾏⽅式3.3 测试类形式3.4 执⾏⽅式3.5 另⼀种执⾏⽅式: 主函数执⾏3.6 特殊⽅法: 函数级别3.7 特殊⽅法: 类级别3.8 特殊⽅法: 函数级别和类级别同时使⽤ 4. pytest 配置⽂件4.1 选项字段获取4.2 编写…...
51LA使用方法与悟空统计,网站数据分析的双重选择
在网站运营与数据分析领域,51LA作为国内较早的流量统计工具,曾为许多用户提供基础的访问数据监测服务。然而,随着技术的发展和用户需求的升级,越来越多的企业开始寻求功能更全面、体验更优的统计工具。小编今天将给大家介绍一款更…...
MongoDB的下载安装与启动
MongoDB的下载安装与启动, 一、MongoDB下载安装 1. 官网下载 打开官网:https://www.mongodb.com/try/download/community选择: 版本(Version):选最新版或者根据需要选旧版。平台(OS࿰…...