<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Next.js on KnightLi的博客</title>
        <link>https://knightli.com/tags/next.js/</link>
        <description>Recent content in Next.js on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 22 Jun 2026 08:05:45 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/next.js/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>World Monitor 本地运行教程：自建全球新闻和态势监控看板</title>
        <link>https://knightli.com/2026/06/22/worldmonitor-local-dashboard-guide/</link>
        <pubDate>Mon, 22 Jun 2026 08:05:45 +0800</pubDate>
        
        <guid>https://knightli.com/2026/06/22/worldmonitor-local-dashboard-guide/</guid>
        <description>&lt;p&gt;&lt;code&gt;koala73/worldmonitor&lt;/code&gt; 是一个实时全球情报看板，用来聚合新闻、地缘事件、基础设施状态和不同主题频道。它更像一个信息态势页面，适合拿来做自建新闻监控入口。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/koala73/worldmonitor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/koala73/worldmonitor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官网：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://worldmonitor.app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://worldmonitor.app&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;本地启动&#34;&gt;本地启动
&lt;/h2&gt;&lt;p&gt;README 的快速开始命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/koala73/worldmonitor.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; worldmonitor
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动后先看默认页面是否正常，再考虑部署。&lt;/p&gt;
&lt;h2 id=&#34;不同频道怎么跑&#34;&gt;不同频道怎么跑
&lt;/h2&gt;&lt;p&gt;项目内置了多个频道开发命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev:tech       &lt;span class=&#34;c1&#34;&gt;# tech.worldmonitor.app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev:finance    &lt;span class=&#34;c1&#34;&gt;# finance.worldmonitor.app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev:commodity  &lt;span class=&#34;c1&#34;&gt;# commodity.worldmonitor.app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev:happy      &lt;span class=&#34;c1&#34;&gt;# happy.worldmonitor.app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev:energy     &lt;span class=&#34;c1&#34;&gt;# energy.worldmonitor.app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你只关心技术新闻，可以先跑 &lt;code&gt;dev:tech&lt;/code&gt;；如果关心金融或大宗商品，就分别试 &lt;code&gt;dev:finance&lt;/code&gt; 和 &lt;code&gt;dev:commodity&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;构建和检查&#34;&gt;构建和检查
&lt;/h2&gt;&lt;p&gt;提交或部署前建议跑：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run typecheck
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run build:full
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这两个命令能先发现 TypeScript 类型问题和生产构建问题。&lt;/p&gt;
&lt;h2 id=&#34;适合怎么用&#34;&gt;适合怎么用
&lt;/h2&gt;&lt;p&gt;World Monitor 适合这些用途：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自己搭一个实时新闻入口。&lt;/li&gt;
&lt;li&gt;给团队做技术、能源、金融、商品主题看板。&lt;/li&gt;
&lt;li&gt;观察多源新闻流，而不是只依赖单个平台推荐。&lt;/li&gt;
&lt;li&gt;二次开发成内部情报 dashboard。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;部署建议&#34;&gt;部署建议
&lt;/h2&gt;&lt;p&gt;README 提到可以看 self-hosting guide，部署方式包括 Vercel、Docker 和静态部署。建议先本地跑通，再部署到 Vercel 或自己的服务器。&lt;/p&gt;
&lt;p&gt;使用时要注意：新闻聚合看板只能帮助你更快看到信号，不代表所有信息都已经核实。对金融、地缘、安全类内容，最好点进原始来源交叉验证。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Vercel AI SDK 是什么？TypeScript 开发者构建 AI 应用的统一工具包</title>
        <link>https://knightli.com/2026/05/17/vercel-ai-sdk-typescript-agent-toolkit/</link>
        <pubDate>Sun, 17 May 2026 23:07:38 +0800</pubDate>
        
        <guid>https://knightli.com/2026/05/17/vercel-ai-sdk-typescript-agent-toolkit/</guid>
        <description>&lt;p&gt;&lt;code&gt;vercel/ai&lt;/code&gt; 是 Vercel 维护的开源 AI SDK。&lt;/p&gt;
&lt;p&gt;它的定位很明确：给 TypeScript 开发者提供一套统一工具，用来构建 AI 应用和 AI Agent。它来自 Next.js 背后的团队，但并不只服务于 Next.js，也支持 React、Svelte、Vue、Angular 等 UI 框架，以及 Node.js 等运行时。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/vercel/ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/vercel/ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你正在做聊天应用、AI 写作工具、RAG 应用、带工具调用的 Agent、流式输出界面，或者想把多个模型供应商接到同一个应用里，Vercel AI SDK 是一个值得关注的基础库。&lt;/p&gt;
&lt;h2 id=&#34;它解决的核心问题&#34;&gt;它解决的核心问题
&lt;/h2&gt;&lt;p&gt;现在做 AI 应用，最大麻烦之一不是“能不能调模型”，而是不同模型供应商的接口、流式输出、工具调用、错误处理和前端状态管理都不一样。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI 有自己的 SDK 和响应格式。&lt;/li&gt;
&lt;li&gt;Anthropic 有自己的消息结构。&lt;/li&gt;
&lt;li&gt;Google、xAI、Mistral、DeepSeek、Groq 等也各有差异。&lt;/li&gt;
&lt;li&gt;流式输出需要处理 chunk。&lt;/li&gt;
&lt;li&gt;工具调用需要处理模型发起的结构化请求。&lt;/li&gt;
&lt;li&gt;前端聊天 UI 还要管理消息、加载状态、取消、重试和错误展示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果每个供应商都手写一套适配层，项目会很快变复杂。&lt;/p&gt;
&lt;p&gt;Vercel AI SDK 的思路是把这些差异收敛到统一 API 后面。开发者用一套接口写应用，再通过 Provider 接入不同模型。&lt;/p&gt;
&lt;h2 id=&#34;统一-provider-架构&#34;&gt;统一 Provider 架构
&lt;/h2&gt;&lt;p&gt;Vercel AI SDK 的一个核心特点，是 provider-agnostic，也就是不绑定单一模型厂商。&lt;/p&gt;
&lt;p&gt;它可以通过统一 API 访问 OpenAI、Anthropic、Google 等模型提供方。项目 README 还提到，默认情况下 AI SDK 会使用 Vercel AI Gateway，让开发者更容易访问多个主流 provider。&lt;/p&gt;
&lt;p&gt;这对工程项目很实用。&lt;/p&gt;
&lt;p&gt;因为很多 AI 产品最终都不会只依赖一个模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有的任务适合强推理模型。&lt;/li&gt;
&lt;li&gt;有的任务适合便宜快速模型。&lt;/li&gt;
&lt;li&gt;有的任务需要多模态。&lt;/li&gt;
&lt;li&gt;有的任务需要长上下文。&lt;/li&gt;
&lt;li&gt;有的任务需要本地或私有部署模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;统一 Provider 架构让应用更容易做模型切换、灰度测试、成本控制和备选方案。&lt;/p&gt;
&lt;h2 id=&#34;流式输出是前端体验的关键&#34;&gt;流式输出是前端体验的关键
&lt;/h2&gt;&lt;p&gt;AI 应用和传统 API 最大的体验差异之一，是响应可能很长。&lt;/p&gt;
&lt;p&gt;如果用户每次都要等完整回答返回，聊天工具、写作工具和代码助手会显得很慢。流式输出可以让文本逐步显示，用户更早看到结果。&lt;/p&gt;
&lt;p&gt;Vercel AI SDK 对流式生成做了比较完整的封装。开发者不需要从零处理底层事件流，而是可以使用 SDK 提供的生成和流式接口，把模型输出接到前端 UI。&lt;/p&gt;
&lt;p&gt;这对 Next.js / React 应用尤其方便。&lt;/p&gt;
&lt;p&gt;一个 AI 聊天界面看起来简单，但实际要处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;消息列表。&lt;/li&gt;
&lt;li&gt;用户输入。&lt;/li&gt;
&lt;li&gt;服务器请求。&lt;/li&gt;
&lt;li&gt;流式 token 展示。&lt;/li&gt;
&lt;li&gt;加载状态。&lt;/li&gt;
&lt;li&gt;错误状态。&lt;/li&gt;
&lt;li&gt;中止生成。&lt;/li&gt;
&lt;li&gt;重新生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些都是 AI SDK 试图帮开发者减少重复劳动的地方。&lt;/p&gt;
&lt;h2 id=&#34;工具调用和-agent-场景&#34;&gt;工具调用和 Agent 场景
&lt;/h2&gt;&lt;p&gt;随着 AI 应用从“聊天”走向“做事”，工具调用变得越来越重要。&lt;/p&gt;
&lt;p&gt;模型不只是输出自然语言，还可能需要调用外部函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查数据库。&lt;/li&gt;
&lt;li&gt;搜索文档。&lt;/li&gt;
&lt;li&gt;调用业务 API。&lt;/li&gt;
&lt;li&gt;读取订单状态。&lt;/li&gt;
&lt;li&gt;生成图表。&lt;/li&gt;
&lt;li&gt;创建日历事件。&lt;/li&gt;
&lt;li&gt;修改项目文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vercel AI SDK 支持工具调用相关能力，让开发者可以定义工具、参数和执行逻辑，再让模型在合适时机请求调用。&lt;/p&gt;
&lt;p&gt;这也是它从“聊天 UI SDK”扩展到“AI 应用和 Agent 工具包”的关键。&lt;/p&gt;
&lt;p&gt;不过，工具调用不是加上去就万事大吉。真实项目还要考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参数校验。&lt;/li&gt;
&lt;li&gt;权限边界。&lt;/li&gt;
&lt;li&gt;工具调用日志。&lt;/li&gt;
&lt;li&gt;幂等性。&lt;/li&gt;
&lt;li&gt;超时和重试。&lt;/li&gt;
&lt;li&gt;人工确认。&lt;/li&gt;
&lt;li&gt;敏感操作限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI SDK 可以帮助处理接口和流程，但安全边界仍然需要开发者自己设计。&lt;/p&gt;
&lt;h2 id=&#34;ui-集成能力&#34;&gt;UI 集成能力
&lt;/h2&gt;&lt;p&gt;Vercel AI SDK 对前端框架比较友好。&lt;/p&gt;
&lt;p&gt;它不仅提供核心生成 API，也围绕聊天、补全、消息状态和流式 UI 做了封装。对于使用 Next.js 和 React 的团队来说，这能减少很多样板代码。&lt;/p&gt;
&lt;p&gt;但它并不只适合 Vercel 部署。&lt;/p&gt;
&lt;p&gt;如果你的项目本身是 TypeScript 技术栈，或者后端运行在 Node.js 环境，AI SDK 仍然可以作为模型调用和流式处理层来使用。是否部署在 Vercel，取决于你的应用架构、团队习惯和基础设施选择。&lt;/p&gt;
&lt;h2 id=&#34;skill-for-coding-agents&#34;&gt;Skill for Coding Agents
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;vercel/ai&lt;/code&gt; README 里还有一个有趣的建议：如果你使用 Claude Code、Cursor 等 coding agent，可以把 AI SDK skill 加到仓库里。&lt;/p&gt;
&lt;p&gt;示例命令是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx skills add vercel/ai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这说明 Vercel 已经意识到，AI SDK 的用户不只是人类开发者，也包括 coding agent。&lt;/p&gt;
&lt;p&gt;当 agent 修改使用 AI SDK 的项目时，如果仓库里有专门的 skill，它可以更好地理解 SDK 约定、常见 API、项目结构和最佳实践，减少乱写代码的概率。&lt;/p&gt;
&lt;p&gt;这个方向很值得注意。&lt;/p&gt;
&lt;p&gt;未来开源项目可能不只提供 README 和 docs，还会提供给 AI coding agent 使用的结构化技能说明。对复杂 SDK 来说，这会变成新的开发者体验入口。&lt;/p&gt;
&lt;h2 id=&#34;适合哪些项目&#34;&gt;适合哪些项目
&lt;/h2&gt;&lt;p&gt;Vercel AI SDK 适合这几类场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Next.js / React 的 AI 聊天应用。&lt;/li&gt;
&lt;li&gt;需要流式输出的写作、问答、客服和代码助手。&lt;/li&gt;
&lt;li&gt;需要接入多个模型 provider 的 AI 产品。&lt;/li&gt;
&lt;li&gt;想快速构建 RAG 或文档问答原型的团队。&lt;/li&gt;
&lt;li&gt;需要工具调用、函数调用或轻量 Agent 能力的应用。&lt;/li&gt;
&lt;li&gt;已经使用 TypeScript / Node.js 技术栈的团队。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它尤其适合前端和全栈开发者。因为很多 AI 应用的难点不只是模型调用，而是如何把模型输出变成稳定、流畅、可交互的产品体验。&lt;/p&gt;
&lt;h2 id=&#34;不适合什么场景&#34;&gt;不适合什么场景
&lt;/h2&gt;&lt;p&gt;如果你的项目主要是 Python 后端、深度学习训练、模型微调或底层推理服务，Vercel AI SDK 可能不是核心工具。&lt;/p&gt;
&lt;p&gt;它更偏应用层，而不是模型训练框架。&lt;/p&gt;
&lt;p&gt;如果你需要的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己训练模型。&lt;/li&gt;
&lt;li&gt;管理 GPU 推理集群。&lt;/li&gt;
&lt;li&gt;做底层 batch inference。&lt;/li&gt;
&lt;li&gt;深度控制 tokenizer、KV cache、量化和推理引擎。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那更应该看 PyTorch、vLLM、SGLang、TensorRT-LLM、llama.cpp 或云厂商推理服务。&lt;/p&gt;
&lt;p&gt;Vercel AI SDK 更像“把模型能力接进产品”的应用开发层。&lt;/p&gt;
&lt;h2 id=&#34;使用时要注意什么&#34;&gt;使用时要注意什么
&lt;/h2&gt;&lt;p&gt;第一，不要把统一 API 理解成完全无差异。&lt;/p&gt;
&lt;p&gt;不同模型 provider 的能力、上下文长度、工具调用格式、流式细节、错误类型和计费方式仍然不同。统一 SDK 能减少工程摩擦，但不能消除模型差异。&lt;/p&gt;
&lt;p&gt;第二，要控制成本。&lt;/p&gt;
&lt;p&gt;AI 应用一旦上线，流式聊天、重试、工具调用、RAG 检索和多模型 fallback 都可能增加调用成本。需要做限流、缓存、日志和预算监控。&lt;/p&gt;
&lt;p&gt;第三，要处理安全边界。&lt;/p&gt;
&lt;p&gt;如果模型能调用工具，就必须限制工具能做什么。不要让模型直接执行高风险操作，也不要把密钥、数据库写权限和生产环境操作裸露给模型。&lt;/p&gt;
&lt;p&gt;第四，要保留可观测性。&lt;/p&gt;
&lt;p&gt;AI 应用出问题时，不能只看前端报错。你需要知道用户输入、模型选择、工具调用、响应时间、token 消耗、错误类型和最终输出。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;vercel/ai&lt;/code&gt; 不是一个新的模型，也不是单纯的聊天组件。&lt;/p&gt;
&lt;p&gt;它更像 TypeScript AI 应用开发的基础设施：统一 Provider、流式输出、工具调用、前端状态管理和 agent 场景，都被放进一个开源 SDK 里。&lt;/p&gt;
&lt;p&gt;对已经使用 Next.js、React、TypeScript、Node.js 的团队来说，它可以显著降低从“模型 API 能跑”到“产品体验可用”的工程成本。&lt;/p&gt;
&lt;p&gt;但它也不是万能层。模型选择、权限设计、成本控制、日志监控和业务安全，仍然需要开发者自己负责。&lt;/p&gt;
&lt;p&gt;如果你想做 AI 应用，而不是训练模型，Vercel AI SDK 是一个值得先试的工具包。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/vercel/ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;vercel/ai GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ai-sdk.dev/docs/introduction&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI SDK Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://vercel.com/blog/introducing-the-vercel-ai-sdk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vercel：Introducing the Vercel AI SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Next.js 高危 SSRF 漏洞 CVE-2026-44578：影响范围与升级建议</title>
        <link>https://knightli.com/2026/05/17/nextjs-cve-2026-44578-websocket-ssrf/</link>
        <pubDate>Sun, 17 May 2026 17:27:13 +0800</pubDate>
        
        <guid>https://knightli.com/2026/05/17/nextjs-cve-2026-44578-websocket-ssrf/</guid>
        <description>&lt;p&gt;Next.js 在 2026 年 5 月披露了一个高危 SSRF 漏洞：CVE-2026-44578。&lt;/p&gt;
&lt;p&gt;根据 GitHub / Vercel 安全公告 &lt;code&gt;GHSA-c4j6-fc7j-m34r&lt;/code&gt; 和 NVD 记录，这个漏洞影响自托管的 Next.js 应用，前提是应用使用内置 Node.js server，并且暴露在可接收恶意 WebSocket upgrade 请求的网络环境中。攻击者可能让服务器代理请求到任意内部或外部地址，从而访问内部服务或云元数据端点。&lt;/p&gt;
&lt;p&gt;Vercel 托管的部署不受影响。修复版本是 &lt;code&gt;15.5.16&lt;/code&gt; 和 &lt;code&gt;16.2.5&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;先说结论&#34;&gt;先说结论
&lt;/h2&gt;&lt;p&gt;如果你在自己服务器、容器、Kubernetes、ECS、VPS、裸机或 PaaS 上自托管 Next.js，需要优先检查。&lt;/p&gt;
&lt;p&gt;受影响范围：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;next &amp;gt;= 13.4.13 &amp;lt; 15.5.16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;next &amp;gt;= 16.0.0 &amp;lt; 16.2.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不受影响或风险较低的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;部署在 Vercel 平台上的应用。&lt;/li&gt;
&lt;li&gt;已升级到 &lt;code&gt;15.5.16&lt;/code&gt;、&lt;code&gt;16.2.5&lt;/code&gt; 或更高版本。&lt;/li&gt;
&lt;li&gt;没有使用内置 Node.js server 暴露服务的场景。&lt;/li&gt;
&lt;li&gt;反向代理或负载均衡已经阻断不需要的 WebSocket upgrade 请求，并且出站访问也做了限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐处置顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先确认生产环境实际运行的 &lt;code&gt;next&lt;/code&gt; 版本。&lt;/li&gt;
&lt;li&gt;自托管应用尽快升级到修复版本。&lt;/li&gt;
&lt;li&gt;暂时无法升级时，在反向代理或负载均衡层阻断不需要的 WebSocket upgrade。&lt;/li&gt;
&lt;li&gt;限制应用服务器访问云元数据、内网管理面和敏感内部服务。&lt;/li&gt;
&lt;li&gt;排查近期异常 WebSocket upgrade 请求和内部访问日志。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;漏洞是什么&#34;&gt;漏洞是什么
&lt;/h2&gt;&lt;p&gt;CVE-2026-44578 是一个 Server-Side Request Forgery，也就是 SSRF 漏洞。&lt;/p&gt;
&lt;p&gt;SSRF 的核心风险是：攻击者不直接访问内部系统，而是诱导你的服务器替他发请求。服务器通常位于更靠近内网、云平台和内部服务的位置，所以一旦被当成代理使用，可能访问到外部攻击者本来碰不到的资源。&lt;/p&gt;
&lt;p&gt;这次 Next.js 的问题出在 WebSocket upgrade 处理路径。安全公告称，自托管应用如果使用内置 Node.js server，攻击者可以通过特制 WebSocket upgrade 请求，让服务器代理访问任意内部或外部目的地。&lt;/p&gt;
&lt;p&gt;风险点包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内网 HTTP 服务。&lt;/li&gt;
&lt;li&gt;管理后台。&lt;/li&gt;
&lt;li&gt;云元数据地址。&lt;/li&gt;
&lt;li&gt;容器或集群内部服务。&lt;/li&gt;
&lt;li&gt;只允许服务器访问的内部 API。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个漏洞的 CVSS v3.1 评分为 &lt;code&gt;8.6 High&lt;/code&gt;，向量是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这意味着攻击面在网络侧，攻击复杂度低，不需要权限，也不需要用户交互，主要影响机密性。&lt;/p&gt;
&lt;h2 id=&#34;为什么自托管更危险&#34;&gt;为什么自托管更危险
&lt;/h2&gt;&lt;p&gt;这次公告明确提到：Vercel-hosted deployments are not affected。&lt;/p&gt;
&lt;p&gt;真正需要重点关注的是自托管部署。原因很简单：自托管应用的网络环境千差万别，有些直接暴露 origin server，有些在 Nginx、Traefik、Ingress、Cloudflare、ALB 或自建网关后面，有些运行在云主机、容器网络或 Kubernetes 集群里。&lt;/p&gt;
&lt;p&gt;如果这些环境没有限制出站访问，Next.js 进程可能看得到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;169.254.169.254&lt;/code&gt; 这类云元数据地址。&lt;/li&gt;
&lt;li&gt;内网 IP 段。&lt;/li&gt;
&lt;li&gt;只在 VPC 内暴露的服务。&lt;/li&gt;
&lt;li&gt;Redis、Elasticsearch、Prometheus、Grafana 等内部组件。&lt;/li&gt;
&lt;li&gt;Kubernetes Service、Pod 或管理端点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 SSRF 的危险不只在 Next.js 本身，而在它所在网络里能访问什么。&lt;/p&gt;
&lt;h2 id=&#34;如何判断是否受影响&#34;&gt;如何判断是否受影响
&lt;/h2&gt;&lt;p&gt;第一步，看 &lt;code&gt;next&lt;/code&gt; 版本。&lt;/p&gt;
&lt;p&gt;在项目目录里执行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm ls next
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pnpm why next
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也可以直接查看：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat package-lock.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat pnpm-lock.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat yarn.lock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果版本落在下面范围，就需要处理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;= 13.4.13 &amp;lt; 15.5.16
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;= 16.0.0 &amp;lt; 16.2.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第二步，看部署方式。&lt;/p&gt;
&lt;p&gt;重点关注这些情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;next start&lt;/code&gt; 运行生产服务。&lt;/li&gt;
&lt;li&gt;使用自定义 Node.js server 承载 Next.js。&lt;/li&gt;
&lt;li&gt;Docker 镜像里直接启动 Next.js server。&lt;/li&gt;
&lt;li&gt;Kubernetes / ECS / VPS / 裸机自托管。&lt;/li&gt;
&lt;li&gt;反向代理后面仍然直接暴露 Next.js origin。&lt;/li&gt;
&lt;li&gt;应用所在网络能访问内部服务或云元数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果应用部署在 Vercel，按官方公告不受这个漏洞影响。但依然建议保持 Next.js 版本更新，因为同一批版本里可能还修复了其他问题。&lt;/p&gt;
&lt;h2 id=&#34;应该升级到什么版本&#34;&gt;应该升级到什么版本
&lt;/h2&gt;&lt;p&gt;官方修复版本是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;15.5.16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;16.2.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;升级示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install next@15.5.16
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或如果使用 16.x：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install next@16.2.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;pnpm：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pnpm add next@15.5.16
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pnpm add next@16.2.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;升级后重新构建并发布：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或按你的 CI/CD 流程重新构建 Docker 镜像并发布。&lt;/p&gt;
&lt;p&gt;如果你的项目锁定在 14.x 或 15.x，不建议为了修漏洞仓促跨大版本到 16.x。更稳妥的做法是先升级到 &lt;code&gt;15.5.16&lt;/code&gt; 这一修复线，完成测试和发布后，再规划大版本升级。&lt;/p&gt;
&lt;h2 id=&#34;临时缓解措施&#34;&gt;临时缓解措施
&lt;/h2&gt;&lt;p&gt;如果暂时不能升级，安全公告给出的核心思路是：不要把 origin server 直接暴露给不可信网络；如果不需要 WebSocket upgrade，就在反向代理或负载均衡层阻断；同时尽量限制 origin 的出站访问。&lt;/p&gt;
&lt;p&gt;可以考虑这些缓解方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不直接暴露 Next.js origin server。&lt;/li&gt;
&lt;li&gt;在 Nginx、Ingress、ALB、Cloudflare 等入口层过滤不需要的 WebSocket upgrade。&lt;/li&gt;
&lt;li&gt;如果业务不使用 WebSocket，直接拒绝带有 upgrade 语义的请求。&lt;/li&gt;
&lt;li&gt;对应用服务器做 egress 限制，禁止访问云元数据地址和敏感内网段。&lt;/li&gt;
&lt;li&gt;用云平台能力启用更安全的元数据访问模式，例如要求 token 的元数据服务。&lt;/li&gt;
&lt;li&gt;对管理后台、数据库、缓存、监控系统增加认证和网络隔离。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意，反向代理规则只是临时缓解，不应该替代升级。框架漏洞最终仍然要通过修复版本解决。&lt;/p&gt;
&lt;h2 id=&#34;运维排查重点&#34;&gt;运维排查重点
&lt;/h2&gt;&lt;p&gt;这个漏洞主要影响机密性，所以排查重点是“有没有被用来访问内部资源”。&lt;/p&gt;
&lt;p&gt;建议关注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web 访问日志中异常的 &lt;code&gt;Upgrade&lt;/code&gt;、&lt;code&gt;Connection&lt;/code&gt;、&lt;code&gt;Host&lt;/code&gt;、路径和来源 IP。&lt;/li&gt;
&lt;li&gt;反向代理或负载均衡日志中异常的 WebSocket upgrade 请求。&lt;/li&gt;
&lt;li&gt;Next.js 服务附近的异常出站连接。&lt;/li&gt;
&lt;li&gt;云元数据服务访问日志或凭据使用记录。&lt;/li&gt;
&lt;li&gt;内网管理服务、监控系统、缓存、搜索服务的异常访问。&lt;/li&gt;
&lt;li&gt;IAM 临时凭据、访问密钥、token 是否有异常调用。&lt;/li&gt;
&lt;li&gt;容器或主机上是否出现异常进程、下载行为或横向移动迹象。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果怀疑被利用，建议按泄露场景处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保留日志和现场。&lt;/li&gt;
&lt;li&gt;轮换可能暴露的云凭据、API key、数据库密码和 session secret。&lt;/li&gt;
&lt;li&gt;检查云账号最近的 API 调用。&lt;/li&gt;
&lt;li&gt;检查内网服务访问记录。&lt;/li&gt;
&lt;li&gt;重建受影响容器或主机。&lt;/li&gt;
&lt;li&gt;复查出站访问策略和元数据保护。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;这和-reactnextjs-rce-不是一回事&#34;&gt;这和 React/Next.js RCE 不是一回事
&lt;/h2&gt;&lt;p&gt;容易混淆的一点是，CVE-2026-44578 是 Next.js WebSocket upgrade SSRF，不是之前 React Server Components 相关的 RCE。&lt;/p&gt;
&lt;p&gt;它的核心影响是让服务器向攻击者指定的内部或外部地址发请求，主要风险是信息泄露和内部资源探测。&lt;/p&gt;
&lt;p&gt;而 React Server Components 相关 RCE 则属于代码执行风险，攻击后果和修复范围不同。&lt;/p&gt;
&lt;p&gt;所以排查时不要只看“Next.js 有漏洞”这个大标题，要把具体 CVE、影响版本、部署模式和修复版本对应起来。&lt;/p&gt;
&lt;h2 id=&#34;哪些团队要优先处理&#34;&gt;哪些团队要优先处理
&lt;/h2&gt;&lt;p&gt;优先级最高的是这些环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自托管 Next.js 生产站点。&lt;/li&gt;
&lt;li&gt;运行在云主机、容器、Kubernetes 或内网环境。&lt;/li&gt;
&lt;li&gt;应用服务器可以访问云元数据服务。&lt;/li&gt;
&lt;li&gt;应用服务器能访问内部管理后台、数据库、缓存或监控系统。&lt;/li&gt;
&lt;li&gt;直接暴露 &lt;code&gt;next start&lt;/code&gt; origin server。&lt;/li&gt;
&lt;li&gt;使用老版本 &lt;code&gt;next&lt;/code&gt;，且升级流程不清晰。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优先级相对较低的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完全部署在 Vercel 的应用。&lt;/li&gt;
&lt;li&gt;已升级到修复版本的应用。&lt;/li&gt;
&lt;li&gt;origin server 不直接暴露，且入口层已经阻断不需要的 WebSocket upgrade。&lt;/li&gt;
&lt;li&gt;出站网络严格受控，无法访问敏感内网资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但“优先级较低”不等于可以不升级。Next.js 是高频暴露组件，框架版本长期落后会叠加更多风险。&lt;/p&gt;
&lt;h2 id=&#34;给开发团队的检查清单&#34;&gt;给开发团队的检查清单
&lt;/h2&gt;&lt;p&gt;可以按下面清单处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 确认所有仓库的 &lt;code&gt;next&lt;/code&gt; 版本。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 查出所有自托管部署，不只看 Vercel 项目。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 标记使用 &lt;code&gt;next start&lt;/code&gt; 或内置 Node.js server 的服务。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 升级到 &lt;code&gt;15.5.16&lt;/code&gt;、&lt;code&gt;16.2.5&lt;/code&gt; 或更高版本。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 重新构建并发布生产镜像。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 在入口层阻断不需要的 WebSocket upgrade。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 限制应用服务器访问云元数据和敏感内网段。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 检查近期异常 upgrade 请求和出站访问。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 轮换疑似暴露的凭据。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 把 Next.js 安全更新纳入依赖更新流程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;CVE-2026-44578 是一个需要认真处理的 Next.js 高危 SSRF 漏洞。&lt;/p&gt;
&lt;p&gt;它不影响 Vercel 托管部署，但影响范围覆盖大量自托管 Next.js 应用：&lt;code&gt;13.4.13&lt;/code&gt; 到 &lt;code&gt;15.5.16&lt;/code&gt; 之前，以及 &lt;code&gt;16.0.0&lt;/code&gt; 到 &lt;code&gt;16.2.5&lt;/code&gt; 之前。漏洞触发点在 WebSocket upgrade 处理路径，攻击者可能让服务器代理访问内部或外部地址，进而暴露内网服务或云元数据端点。&lt;/p&gt;
&lt;p&gt;最直接的修复方式是升级到 &lt;code&gt;15.5.16&lt;/code&gt; 或 &lt;code&gt;16.2.5&lt;/code&gt;。临时缓解则是不要直接暴露 origin server，阻断不需要的 WebSocket upgrade，并限制应用服务器的出站访问。&lt;/p&gt;
&lt;p&gt;对运维团队来说，重点不是只看 CVE 分数，而是看你的 Next.js 服务所在网络能访问什么。SSRF 的真实风险，往往取决于服务器背后有哪些内网资源和云权限。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Advisory：GHSA-c4j6-fc7j-m34r&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2026-44578&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NVD：CVE-2026-44578&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://security.snyk.io/vuln/SNYK-JS-NEXT-16638682&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Snyk：SNYK-JS-NEXT-16638682&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
