Axios v1.x 版本演进全解析:基于 CHANGELOG 读懂安全加固、功能迭代与适配器演进(v1.0.0 → v1.19.0)

发布时间:2026/9/7 14:48:37
Axios v1.x 版本演进全解析:基于 CHANGELOG 读懂安全加固、功能迭代与适配器演进(v1.0.0 → v1.19.0) Axios v1.x 版本演进全解析基于 CHANGELOG 读懂安全加固、功能迭代与适配器演进v1.0.0 → v1.19.0【免费下载链接】axiosPromise based HTTP client for the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/ax/axios本文以仓库内的 CHANGELOG.md 为骨架系统梳理 Axios面向浏览器与 Node.js 的 Promise 风格 HTTP 客户端从 v1.0.02022-10-04到 v1.19.02026-07-22的完整版本记录重点解读其中的安全修复脉络、新功能演进、适配器与多运行时支持以及升级前必须关注的行为变更。每一条关键改动都会对照lib/下的实际源码进行交叉印证帮助你在选型、升级或排查回归问题时快速定位版本间的安全边界差异与行为变化。一、版本脉络总览从 v1.0.0 到 v1.19.0CHANGELOG 当前记录的最新版本为 v1.19.0。这一版本与仓库 package.json 中声明的version: 1.19.0保持一致也说明本仓库快照对应 1.19.0 发布后的代码状态。整条 v1.x 时间线可以划分为三个阶段初始发布期1.0.0 ~ 1.3.x2022-10 ~ 2023-041.x 大版本落地补齐toFormData、formToJSON、自定义paramsSerializer、Node.js data URL 支持等基础能力。安全与功能密集迭代期1.4.0 ~ 1.13.x2023-04 ~ 2026-01引入 fetch 适配器、HTTP/2、allowAbsoluteUrls等里程碑功能同时密集处理 CSRF、ReDoS、SSRF、原型污染等安全漏洞。安全加固与多运行时支持期1.14.0 ~ 1.19.02026-02 ~ 2026-07全面转向供应链加固、CRLF/原型污染纵深防御、allowedSocketPathsSSRF 白名单并正式支持 Deno、Bun 运行时。下表汇总了各版本的核心主题完整逐条记录见 CHANGELOG.md版本日期核心主题1.0.02022-10-041.x 大版本toFormData、formToJSON、paramsSerializer、data URL、AxiosError增强1.1.0 ~ 1.1.32022-10CommonJS/UMD 导出修复、clear()拦截器、自定义paramsSerializer1.2.0 ~ 1.2.62022-11 ~ 2023-01模块导出重构、AxiosHeaders改进、AxiosError.toJSON防循环引用1.3.0 ~ 1.3.62023-01 ~ 2023-04规范符合的 FormData/Blob 支持、自定义lookup函数、AxiosHeaderValue导出1.4.02023-04-27自定义lookup函数DNS、mergeConfig性能优化1.5.0 ~ 1.5.12023-08 ~ 2023-09导出getAdapter、无unsafe前缀导出适配器1.6.0 ~ 1.6.82023-10 ~ 2024-03CVE-2023-45857CSRF/XSRF、withXSRFToken、ReDoS 修复1.7.0-beta.0 ~ 1.7.02024-04 ~ 2024-05fetch 适配器落地1.7.1 ~ 1.7.92024-05 ~ 2024-12CVE-2024-39338SSRF、fetch/XHR 细节修复1.8.0 ~ 1.8.42025-02 ~ 2025-03allowAbsoluteUrls配置BREAKING1.9.02025-04-24AxiosHeaders.getSetCookie()1.10.0 ~ 1.12.02025-06 ~ 2025-09fetchenv配置变量、JSON.parsereviver、底层错误经cause暴露1.13.0 ~ 1.13.62025-10 ~ 2026-02HTTP/2 支持、useLegacyInterceptorOrder、isAbsoluteURL校验、React Native Blob1.14.02026-03-27测试套件迁移 Vitest、formidable升级 v3、CommonJS 兼容修复1.15.02026-04-07CRLF 头注入防护、shouldBypassProxySSRF、Deno/Bun 官方支持、CI 供应链加固1.15.12026-04-19头注入、withXSRFToken真值绕过、maxBodyLength零重定向修复1.15.22026-04-21allowedSocketPathsSSRF 白名单、keep-alive 连接池内存泄漏修复1.16.0 ~ 1.16.12026-05QUERY 方法、ECONNREFUSED常量、fetch 适配器强制maxBodyLength/maxContentLength1.17.02026-06-01Node HTTP zstd 解压、transitional.advertiseZstdAcceptEncoding1.18.02026-06-13transitional.validateStatusUndefinedResolves、跨域重定向敏感头剥离、ERR_INVALID_URL1.19.02026-07-22form-data 版本下限提升、AxiosHeaders.parseParameters()、Cloudflare 520 状态码、NO_PROXY 匹配加固说明版本号遵循语义化版本SemVer原则1.x主版本内只引入向后兼容的功能与修复破坏性变更如allowAbsoluteUrls会在 CHANGELOG 中单独以BREAKING CHANGES标注。关于版本策略的完整约定可参阅仓库文档 semver.md跨版本迁移注意事项见 MIGRATION_GUIDE.md。二、安全修复演进线重点安全修复是 CHANGELOG 中最密集、也最值得逐条阅读的线索。v1.x 的安全加固呈现出明显的“纵深防御”趋势从最初修复单点漏洞CSRF、ReDoS逐步演进到对配置读取、请求体/响应体限制、头注入、SSRF、原型污染的全面加固。以下按时间线梳理并对照源码印证。2.1 早期漏洞CSRF、ReDoS 与原型污染v1.6.0CVE-2023-45857修复了一个 CSRF 漏洞其本质是withXSRFToken/凭证相关路径在非标准环境下可能泄露 XSRF token。该修复在 CHANGELOG 中以 “⚠️ Critical vulnerability fix” 标注。v1.6.3ReDoS#6132修复了正则表达式拒绝服务漏洞与后续版本中对parseProtocol、参数解析等正则的收紧一脉相承。v1.6.4原型污染#6167修复formToJSON原型污染漏洞。当前源码 lib/helpers/formDataToJSON.js 第 81 行保留了显式防护在buildPath中遇到name __proto__时直接return true跳过确保污染键无法通过反序列化写入对象原型。// lib/helpers/formDataToJSON.js节选 function buildPath(path, value, target, index) { // ... let name path[index]; if (name __proto__) return true; // 第 81 行原型污染防护 // ... }2.2 SSRF 与协议校验v1.7.4CVE-2024-39338#6539拒绝协议相对 URL//host/...修复 SSRF。这一约束直接体现在当前的协议解析逻辑中。lib/helpers/parseProtocol.js 的正则要求协议分隔符必须带冒号// lib/helpers/parseProtocol.js export default function parseProtocol(url) { const match /^([-\w]{1,25}):(?:\/\/)?/.exec(url); return (match match[1]) || ; }v1.18.0#11000进一步收紧——对于省略//的畸形http:/https:URL直接抛出ERR_INVALID_URL。这一逻辑位于 lib/core/buildFullPath.js第 8 行的malformedHttpProtocol /^https?:(?!\/\/)/i配合第 45–56 行的assertValidHttpProtocolURL完成校验。2.3 头注入与 CRLF 防御v1.15.0CRLF 头注入#10660拒绝任何包含\r或\n的头值阻断可用于窃取云元数据IMDS的 CRLF 注入链。行为变更含 CR/LF 的头现在会抛出Invalid character in header content。v1.15.1#10749、#10758收紧请求头构造的校验与清洗并在 multipart 头值中正确剥离 CR/LF防止通过字段名/文件名注入。v1.15.1withXSRFToken真值绕过#10762对任何“真值但非布尔”的配置短路避免歧义配置导致 XSRF token 跨源静默泄露。2.4 请求体/响应体限制与maxBodyLengthv1.15.1#10753、#10754即使在maxRedirects: 0时也强制maxBodyLength并对流式响应应用maxContentLength封堵超大请求体绕过路径。v1.16.0#10795fetch 适配器开始强制执行maxBodyLength与maxContentLength——在 1.16.0 之前这两个限制在 fetch 适配器上被静默忽略。这是一项可观察行为变更依赖其作为 DoS 防护的旧代码需要重新评估详见第五节。2.5 SSRF 白名单shouldBypassProxy与allowedSocketPathsv1.15.0#10661引入shouldBypassProxy辅助函数在评估no_proxy/NO_PROXY规则前规范化主机名去除尾部点、处理括号 IPv6堵住回环/内网主机被意外代理的缺口。v1.15.2#10777新增allowedSocketPaths配置选项用于限制 Node HTTP 适配器允许的 Unix domain socket 路径从而缓解通过socketPath的 SSRF不匹配时返回AxiosError的ERR_BAD_OPTION_VALUE。该白名单校验位于 lib/adapters/http.js 第 957–961 行附近。// lib/adapters/http.js节选 const allowedSocketPaths own(allowedSocketPaths); if (allowedSocketPaths ! null) { const allowed Array.isArray(allowedSocketPaths) ? allowedSocketPaths : [allowedSocketPaths]; // ... 对 socketPath 做白名单校验不匹配则抛 ERR_BAD_OPTION_VALUE }v1.19.0NO_PROXY 匹配加固#11029、#11053在 NO_PROXY 匹配时规范化 IPv4 的简写/八进制/十六进制形式并支持逗号或空格分隔列表中的*条目。这一复杂度直接体现在 lib/helpers/shouldBypassProxy.jsnormalizeIPAddress第 61 行起负责把127.1、1.2.3、八进制、0x十六进制等形态还原为点分十进制shouldBypassProxy第 438 行起在第 453–455 行处理noProxy *的整体绕过并对每个条目做 CIDR、后缀、端口与回环判定。2.6 原型污染纵深防御v1.13.5#7369加固mergeConfig忽略__proto__、constructor、prototype键防止合并用户配置时的原型污染拒绝服务。v1.15.2#10779Node HTTP 适配器及resolveConfig/mergeConfig/validator 路径只读取自有属性并使用 null 原型配置对象防止被污染的auth、baseURL、socketPath、beforeRedirect、insecureHTTPParser影响请求。v1.16.1#7413formDataToJSON通过只遍历自有属性防御已被污染的Object.prototype。v1.17.0#10901、#10922用自有属性检查保护socketPath、params、paramsSerializer的读取阻断继承原型值影响请求行为含 SSRF 敏感路径。2.7 供应链与发布安全v1.15.2#10776新增.npmrcignore-scriptstrue、lockfile lint CI、可复现构建 diff、范围化 CODEOWNERS扩展 SECURITY.md 与 THREATMODEL.md含npm audit signatures溯源验证、60 天解决策略与事件响应手册。v1.15.0#10618 等CI 安全加固——引入 zizmor Actions 安全扫描、npm 发布切换 OIDC Trusted Publishing移除长期NODE_AUTH_TOKEN、所有 action 引用固定到完整 commit SHA、工作流权限最小化、发布步骤置于独立npm-publish环境、禁止 fork 运行 sponsor 工作流。v1.17.0#10926发布工作流切换 npm staged publishing更安全、可审计、带 provenance。v1.19.0#11083简化 v1 发布改用 Node.js 26 自带的 npm。2.8 最新依赖漏洞form-data CRLF 注入v1.19.0v1.19.0#11028将form-data依赖版本下限提升到^4.0.6避免新安装解析到受 CRLF 注入漏洞影响的版本。这一点在当前 package.json 的依赖中可直接验证form-data: ^4.0.6与 CHANGELOG 描述一致。三、新功能与能力演进线除安全外CHANGELOG 记录了若干改变使用方式的里程碑功能。以下按主题梳理并对照源码。3.1 fetch 适配器v1.7.0里程碑v1.7.0-beta.02024-04-28→ v1.7.02024-05-19#6371正式引入 fetch 适配器成为 Node 环境下的第三适配层。后续版本围绕 fetch 适配器做了大量打磨v1.7.0-beta.1#6380将 fetch 相关TypeError归类为AxiosError.ERR_NETWORKv1.7.6#6524修正 FormData 载荷的Content-Length计算#6582优化信号组合逻辑v1.7.7#6584Safari 流处理回退到流读取器v1.7.5#6533Cloudflare Workers 凭证处理v1.12.0#7003为 fetch 适配器新增fetch/Request/Response的env配置变量#6982将底层网络错误细节通过cause暴露v1.16.0#10795、#10772、#10806强制maxBodyLength/maxContentLength、User-Agent与 HTTP 适配器对齐、保留原始 abort 原因。3.2 配置与请求控制v1.1.3#5113支持自定义paramsSerializer。v1.4.0#5339支持自定义lookup函数DNS 解析可插拔。v1.5.0#5324、#5839导出getAdapter并以无unsafe前缀导出适配器。v1.6.2#6046新增withXSRFToken选项作为恢复旧版withCredentials行为的替代方案需与withCredentials配合使用。v1.8.0#5902、#6192新增忽略绝对 URL 的配置allowAbsoluteUrls这是一项BREAKING CHANGE——此前依赖“请求 URL 优先于合并”的代码现在会改为合并 URL。该逻辑位于 lib/core/buildFullPath.js 第 68–76 行allowAbsoluteUrls false时强制走combineURLs。v1.9.0#5707AxiosHeaders新增getSetCookie()方法。v1.13.5#7326isAbsoluteURL增加输入校验优雅处理畸形/意外输入。3.3 HTTP/2 与压缩v1.13.0#7150Node HTTP 适配器新增 HTTP/2 支持会话池逻辑在v1.17.0#10861被抽取为独立辅助模块 lib/helpers/Http2Sessions.jssessionTimeout默认 1000ms并补充会话池、超时、清理行为的单元测试。v1.13.3#7256HTTPS 连接默认使用 443 端口。v1.17.0#6792、#10920Node HTTP 适配器支持 zstd 响应解压由transitional.advertiseZstdAcceptEncoding控制是否在Accept-Encoding中声明zstd。源码印证lib/defaults/transitional.js 第 8 行advertiseZstdAcceptEncoding: falselib/adapters/http.js 第 49 行定义zstdOptions、第 57 行拼接ACCEPT_ENCODING_WITH_ZSTD、第 1190 行对zstd内容编码分支调用zlib.createZstdDecompress。3.4 类型与序列化增强v1.12.0#5926JSON.parse支持 reviver#7003fetchenv配置变量。v1.16.0#10802、#10680、#6897支持 QUERY HTTP 方法跨适配器与类型定义AxiosError暴露ECONNREFUSED常量便于按常量而非字符串匹配“连接被拒绝”——见 lib/core/AxiosError.js 第 208 行从buildURL导出内部encode辅助函数便于用户自定义参数序列化器复用 axios 的编码逻辑。v1.17.0#10952、#10956修正AxiosHeaders.toJSON()返回类型并将 CommonJSisCancel类型收窄到CanceledErrorT。v1.18.0#10899新增transitional.validateStatusUndefinedResolves让应用可选择把validateStatus: undefined当作“未提供该选项”处理而validateStatus: null仍是“接受所有状态”的显式方式。源码印证lib/defaults/transitional.js 第 9 行validateStatusUndefinedResolves: trueindex.d.ts 第 305–306 行声明两个transitional字段。v1.19.0#11043、#11081、#11051、#11067让mergeConfig保留自有可枚举的 symbol 键字段并在公开 TypeScript 声明、响应、错误、适配器与序列化器中引入通用params类型新增可选的AxiosHeaders.parseParameters()解析器引号感知、RFC 风格 HTTP 参数解析同时保留旧的解析行为——见 lib/core/AxiosHeaders.js 第 414–415 行static parseParameters补上缺失的 Cloudflare520 WebServerReturnsAnUnknownError状态码及对应 ESM/CJS 声明——见 lib/helpers/HttpStatusCode.js 第 73 行。3.5 错误与序列化健壮性v1.19.0#11044、#11059在 JSON 兼容快照中将Set值序列化为数组并为原本为空的AggregateError合成有用的AxiosError消息。源码印证lib/core/AxiosError.js 第 83–96 行aggregateErrorMessage在AxiosError.from第 99–131 行中当error.message为空且存在error.errors时调用从而避免双栈/Happy-Eyeballs 连接失败时出现空白消息。v1.19.0#11008、#11038畸形协议错误中带上“规范化、安全脱敏”的出错 URL并在拼接 base URL 时去除重复的尾斜杠。源码印证lib/core/buildFullPath.js 第 18–43 行redactSensitiveURLParts用 lib/core/AxiosError.js 第 6 行导出的REDACTED标记替换 userinfo、查询值、fragment第 50 行将脱敏 URL 嵌入ERR_INVALID_URL消息。v1.19.0#11035组合中止信号时立即传播“已中止”的输入信号。源码印证lib/helpers/composeSignals.js 第 53–56 行遍历信号时若signal.aborted为真则直接onabort而非等待后续abort事件。v1.19.0#11061修正 base64data:URL 的大小估算使maxContentLength在 HTTP 与 Fetch 适配器间一致执行。源码印证lib/helpers/estimateDataURLDecodedBytes.js 同时导出estimateDataURLDecodedBytes面向 Fetch第 148 行与estimateDataURLBufferAllocation面向 NodeBuffer.from第 164 行分别对应两种解码路径的真实字节占用。四、适配器与多运行时支持演进Axios 通过适配层抹平环境差异Node 使用http适配器浏览器使用xhr/fetch并逐步扩展到 Deno、Bun、React Native。4.1 三大适配器httpNodelib/adapters/http.jsxhr浏览器lib/adapters/xhr.jsfetchv1.7.0lib/adapters/fetch.js适配器的加载与按名导出在 v1.2.0#5277 “allowing adapters to be loaded by name”、v1.5.0导出getAdapter逐步成型。4.2 Nodehttp适配器的关键修复v1.13.1#7193修复非 OK 状态响应时数据流被中断的回归。v1.13.2#7206修复 keep-alive 请求在带超时时的socket hang up#7202提前退出循环的性能改进。v1.15.2#10788修复 keep-alive 连接池内存泄漏——为每个 socket 安装单一error监听器通过kAxiosSocketListener/kAxiosCurrentReq追踪活跃请求消除按请求累积监听器导致的MaxListenersExceededWarning与线性堆增长。v1.17.0#10957通过 HTTP CONNECT 代理隧穿 HTTPS 请求时保留用户httpsAgent的 TLS 选项。4.3 XHR / 浏览器细节v1.16.0#10787在 error、timeout、abort 路径上退订cancelToken与AbortSignal监听器防止订阅泄漏。v1.16.1#10868防止某些环境在 XHR 上传时输出的畸形ProgressEvent缺失/非法loaded/total导致崩溃。v1.16.1#10864修复 fetch 适配器中 Webpack 4 无法解析的语法恢复旧版打包器兼容性。4.4 Deno、Bun 与 React Native 支持v1.13.3#5754为package.json增加bun导出条件让 Bun 加载 Node.js 构建而非浏览器构建。当前 package.json 的exports中同时存在bun、react-native、browser、default条件印证了这一演进。v1.15.0#10652为 Deno 与 Bun 增加完整 smoke 测试套件并在每次发版前于 CI 中运行两种运行时。仓库中对应目录为 tests/smoke/deno 与 tests/smoke/bunpackage.json 的 scripts 提供test:smoke:denodeno task ...与test:smoke:bunbun test --cwd tests/smoke/bun。v1.13.6#5764在 React Native 环境正确处理原生Blob对象。v1.13.6#7386修复 React Native / Browserify 的模块导出问题。适用前提Deno/Bun 的官方支持smoke 套件 CI 前置校验自 v1.15.0 起bun导出条件自 v1.13.3 起。低版本运行时的行为可能不一致升级前建议在目标运行时跑一次 smoke 测试。五、升级前必须关注的行为变更CHANGELOG 中有一批“可观察行为变更”直接决定升级是否安全。建议升级时按下表逐项核对版本变更影响与建议1.7.4拒绝协议相对 URLSSRF#6539依赖//host/...形式请求的代码会失效需改为完整协议 URL1.8.0allowAbsoluteUrlsBREAKING#6192默认改为合并 base 与请求 URL如需旧行为需显式配置1.13.5拦截器执行顺序变化依赖 v1.13 之前顺序的应用可启用useLegacyInterceptorOrder回退1.15.0含 CR/LF 的头值抛错旧代码若向头中注入换行会由“静默”变为“抛异常”1.16.0fetch 适配器强制maxBodyLength/maxContentLength之前被忽略的体积上限现在真正生效超大请求/下载可能开始报错1.16.0代理路径保留用户Host头#10822虚拟主机式代理路由行为改变1.16.0URL 内嵌 Basic auth 凭据改为 URL 解码#10825形如https://user:p%40sshost现在按解码值上网1.16.0unescape()替换为现代 UTF-8 编码#7378非 ASCII URL 处理回归规范依赖旧unescape怪癖的输出字节可能不同1.18.0畸形http:/https:URL 抛ERR_INVALID_URL#11000省略//的 URL 不再被宽松解析1.19.0同步请求拦截器失败后不再派发请求#11071除非配对的 rejection 处理成功否则请求不再发出1.19.0负进度值钳制为 0#11039进度回调不再出现负值以v1.16.0为例CHANGELOG 明确提示 fetch 适配器的maxBodyLength/maxContentLength此前被静默忽略把 axios 从 1.15.x 升到 1.16.0 的团队若之前依赖“无体积限制”的默认需重新评估下载/上传上限否则可能出现新的ERR_BAD_RESPONSE/体积相关错误。六、工程化与发布流程演进CHANGELOG 的 “Maintenance Chores” 部分记录了工程链路的演进对理解仓库的构建与测试布局很有帮助v1.2.2引入 conventional-changelog 自动化与 GitHub Actions 发布脚本#5384、#5397 等奠定自动发布基础。v1.14.0#7484 等测试套件整体迁移到 Vitest、ESLint 升级 v10、Rollup 升级、Husky 9、TypeScript 升级、Express 测试脚手架现代化。当前 package.json 的test指向vitest run并提供test:vitest:unit、test:vitest:browser等分项印证迁移完成。v1.15.0CI 供应链安全加固OIDC 发布、SHA 固定、权限最小化见第 2.7 节。v1.17.0#10939通过files白名单并去掉不需要的未压缩 source map降低发布包体积。当前 package.json 的files字段即为白名单形式。v1.19.0#11054仅对发布的压缩 bundle 生成 source map从非压缩构建中移除失效的 map 引用。运行/查看方式均为只读说明不修改仓库单元测试npm run test:vitest或分项test:vitest:unit/test:vitest:browserDeno smokenpm run test:smoke:denoBun smokenpm run test:smoke:bun构建npm run build七、如何高效阅读 CHANGELOG 并定位源码结合本仓库建议按以下方式把 CHANGELOG 条目落到可验证的代码位置确认当前版本先读 package.json 的version字段对齐 CHANGELOG 顶部版本当前为 1.19.0。安全条目在 CHANGELOG 的 Security Fixes小节按版本检索 CVE/PR 号再对照源码印证——例如shouldBypassProxy见 lib/helpers/shouldBypassProxy.js原型污染防护见 lib/helpers/formDataToJSON.js、lib/core/mergeConfig.jsSSRF 白名单见 lib/adapters/http.js。功能条目 New Features小节的配置项通常落在 lib/defaults/transitional.jstransitional 开关与 index.d.ts类型声明行为实现落在对应适配器lib/adapters/*或核心lib/core/*。修复条目 Bug Fixes按模块名http/fetch/xhr/headers/types定位到对应文件必要时再查tests/下同名测试用例佐证。版本语义与迁移配合 semver.md 理解版本约定配合 MIGRATION_GUIDE.md 处理跨版本迁移配合 SECURITY.md 与 THREATMODEL.md 理解安全边界与披露策略。小结Axios 的 v1.x 演进是一条“功能落地 → 安全纵深加固 → 多运行时支持”的清晰主线。从 1.0.0 的基础能力到 1.6.0/1.7.4 的 CSRF 与 SSRF 修复再到 1.15.x 的 CRLF/原型污染防御与allowedSocketPaths白名单直至 1.19.0 的 form-data 版本下限提升与 NO_PROXY 匹配加固每一步都能在lib/源码中找到对应实现。对使用者而言读懂这份 CHANGELOG 的价值在于升级前能预判安全边界与行为变更尤其 1.16.0 的 fetch 体积上限、1.8.0 的allowAbsoluteUrls并能把每条变更精确映射到源码与测试从而做出有依据的升级决策。【免费下载链接】axiosPromise based HTTP client for the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/ax/axios创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考