9.0 KiB
依赖漏洞修复执行方案
制定时间:2026-07-15
基线扫描:npm audit --registry=https://registry.npmjs.org→ 174 项(Critical 34 / High 77 / Moderate 42 / Low 21)
关联文档:dependabot-remediation.md
Dependabot:https://github.com/ShopeX/ECShopX_admin-frontend/security/dependabot
一、修复目标
| 阶段 | 目标 | 预计剩余告警 | 工期 |
|---|---|---|---|
| PR-1 清理 | 删除无用依赖 + audit fix | ~120 项 | 0.5 天 |
| PR-2 运行时升级 | axios / qs / lodash-es 等 | ~90 项 | 2~3 天 |
| PR-3 构建链 | sass-loader、xlsx 替换等 | ~70 项 | 2 天 |
| PR-4 接受风险 | Vue 2 生态 Document | ~50 项(长期) | 持续 |
本方案目标:3 个 PR 内将 Critical 清零、High 降至 30 以下;Vue 2 相关 Low 暂 Accept。
二、PR-1:零风险清理(优先合并)
2.1 删除未使用 / 误装依赖
经全仓检索,以下包 无任何业务引用,删除不影响构建与运行:
| 包 | 类型 | 删除理由 |
|---|---|---|
babel-preset-env |
dev | Babel 6 遗留;babel.config.js 已用 Babel 7 |
big |
prod | 误装 HTTP 框架;业务用的是 big.js(传递依赖) |
qiniu-webpack-plugin |
prod | vue.config.js 仅 require 未使用;已有 webpack-aliyun-oss |
node-sass-js-importer |
dev | 无引用;项目使用 sass(dart-sass) |
2.2 代码改动
vue.config.js — 删除第 2 行:
- const QiniuPlugin = require('qiniu-webpack-plugin')
2.3 执行命令
npm uninstall babel-preset-env big qiniu-webpack-plugin node-sass-js-importer
npm audit fix --registry=https://registry.npmjs.org
npm run build:b2c
npm run build:bbc
2.4 验证
npm audit --registry=https://registry.npmjs.org | tail -3
# 记录剩余数量,更新本文档 §六 进度表
2.5 预期效果
- 消除
babel-preset-env整条 Babel 6 Critical 链(约 20+ 项) - 消除
big带入的 express/morgan/request 等 Critical 链 - 消除
qiniu-webpack-plugin相关 High audit fix自动修复 webpack、yaml、semver 等传递依赖
风险:极低
建议 TB:可单独开安全清理任务
三、PR-2:运行时依赖升级(需全量回归)
3.1 升级清单
| 包 | 当前 | 目标 | 级别 | 改动范围 |
|---|---|---|---|---|
axios |
0.19.2 | 1.8.0 | High | 全局 HTTP,重点见 §3.2 |
qs |
^6.4.0 | ^6.14.0 | High | 3 个文件 |
lodash-es |
4.17.21 | 4.17.23 | High | 传递 + 直接 |
nanoid |
2.1.8 | 3.3.8 | Moderate | API 兼容,检查调用方 |
@antv/g2plot |
2.4.31 | 2.4.35+ | High | 3 个图表页 |
3.2 axios 升级专项(风险最高)
执行:
npm install axios@1.8.0
必查文件:
src/api/request/index.js # 主请求封装、拦截器、Token 刷新
src/api/request/request.js
src/utils/fetch.js # 旧封装
src/utils/axiosJsonp.js
src/api/req.js
src/api/ossStorage.js
回归清单:
- 登录 / 登出 / Token 过期刷新
- 列表分页、筛选、导出
- 文件上传(OSS / COS)
- FormData / 文件下载
- 错误提示(401 / 403 / 500)
常见破坏性变化:
- 错误对象结构细微差异 → 检查
error.response判空 - 默认
Content-Type行为 → 上传接口重点测 - 不再内置某些旧版 hack → 检查
utils/fetch.js
3.3 qs 升级
npm install qs@6.14.0
文件:
src/api/request/index.jssrc/utils/fetch.jssrc/api/shipping.js
回归: 带复杂 query 的列表筛选、数组参数序列化。
3.4 其余小版本
npm install lodash-es@4.17.23 nanoid@3.3.8
npm install @antv/g2plot@latest # 锁定后检查 lock 版本 ≤ 当前大版本
npm audit fix --registry=https://registry.npmjs.org
图表回归页:
src/views/dashboard/index.vuesrc/views/dashboard/merchant-dashboard.vuesrc/view/mall/datacube/companydata/order.vue
3.5 PR-2 验证命令
npm run build:b2c && npm run build:bbc
npm audit --registry=https://registry.npmjs.org --audit-level=high
风险:中(axios 为主)
建议:PR-2 仅含运行时 prod 依赖,不要混入 dev 构建链改动
四、PR-3:构建链与无修复包处理
4.1 xlsx → exceljs(推荐)
现状:xlsx@0.18.5 High,社区版 无 npm 修复
使用处:仅 build/update_i18n_from_excel.js
方案:
npm uninstall xlsx
npm install -D exceljs
重写 build/update_i18n_from_excel.js 读写逻辑(仅开发脚本,不影响生产包体积若放 devDependencies)。
替代:若脚本使用频率极低,可改为手动维护 JSON,直接删除 xlsx。
4.2 sass 构建链
项目已用 sass(dart-sass),可升级 loader:
npm install -D sass-loader@^13.3.0
检查 vue.config.js 中 sass/scss loaderOptions 是否需适配。
不要再引入 node-sass / node-sass-js-importer(PR-1 已删)。
4.3 package.json overrides 扩展
PR-1、2 完成后若 High 仍多,追加:
"overrides": {
"resource": "0.8.1",
"xmlhttprequest": "1.8.0",
"jugglingdb-nano": "0.0.1",
"global": "2.0.1",
"webpack": "^5.104.1",
"ws": "^8.18.0",
"semver": "^7.7.0",
"lodash": "^4.17.23",
"follow-redirects": "^1.15.9"
}
rm -rf node_modules package-lock.json
npm install
npm run build:b2c
全量重装 lock 影响面大,建议在 PR-3 单独做,便于回滚。
4.4 devDependencies 可选升级(非阻塞)
| 包 | 建议 | 说明 |
|---|---|---|
postcss |
^8.5.6 | audit fix 或手动 |
svgo |
最新 3.x | 构建 svg 优化 |
prettier-eslint-cli |
^8.0.1 或移除 | 仅本地 lint |
compression-webpack-plugin 等 |
audit fix | 随 lock 更新 |
4.5 PR-3 验证
npm run build:b2c
npm run build:bbc
node build/update_i18n_from_excel.js # 若改 xlsx
npm audit --registry=https://registry.npmjs.org
五、PR-4:无法修复项 — Dependabot Accept Risk
以下告警 暂无安全修复版本,在 GitHub Dependabot 标记 Accept risk 并统一备注:
Vue 2 已 EOL,计划 Vue 3 + Element Plus 迁移后消除。跟踪文档:docs/security/fix-plan.md
| 包 | 级别 | 原因 |
|---|---|---|
vue@2.7.x |
Low | ReDoS,无官方补丁 |
element-ui |
Low | 依赖 vue |
vue-template-compiler |
Moderate | 编译期 XSS,仅构建时;不编译不可信模板 |
@icon-park/vue / lucide-vue / vuex |
Low | 连带 vue |
@shopex-ui/finder |
Low | 连带 element-ui |
禁止:对以上包执行 npm audit fix --force。
六、进度跟踪表(执行时填写)
| PR | 状态 | 执行日 | audit 总数 | Critical | High | 备注 |
|---|---|---|---|---|---|---|
| 基线 | ✅ | 2026-07-15 | 174 | 34 | 77 | 本地扫描 |
| PR-1+2 | ✅ | 2026-07-15 | 68 | 1 | 31 | 删 4 包 + audit fix + axios/qs/lodash/nanoid |
| PR-3 | ✅ | 2026-07-15 | 63 | 0 | 24 | xlsx→exceljs + overrides + g2plot/cos |
| PR-3b | ✅ | 2026-07-15 | 61 | 0 | 25 | prettier-eslint-cli 5→8 |
| PR-4 | ⬜ | 见 dependabot-accept-list.md |
每次 PR 合并后执行:
npm audit --registry=https://registry.npmjs.org 2>&1 | grep -E "vulnerabilities|low|moderate|high|critical"
七、禁止事项
| 操作 | 原因 |
|---|---|
npm audit fix --force |
会把 Vue CLI 降到 3.x,构建必挂 |
| 一次性升 Vue 3 | 范围过大,应单独立项 |
升级 big 到 0.3.1 |
应 删除 big,不是升级 |
| 在 npmmirror 上跑 audit | 不支持,结果为空或报错 |
八、推荐排期(1 人)
第 1 天上午 PR-1 删除 4 包 + vue.config 清理 + audit fix + 构建
第 1 天下午 PR-2 qs / lodash-es / nanoid / g2plot + 构建
第 2~3 天 PR-2 axios 升级 + 全站业务回归
第 4 天 PR-3 xlsx → exceljs + sass-loader + overrides
第 4 天下午 PR-4 Dependabot bulk dismiss + 文档更新
九、CI 建议(修复完成后)
# .gitlab-ci.yml 或 GitHub Actions 示例片段
- npm audit --registry=https://registry.npmjs.org --audit-level=critical
# 或仅 prod:
- npm audit --registry=https://registry.npmjs.org --omit=dev --audit-level=high
初期可设 allow_failure: true,PR-3 完成后改为阻断。
十、快速命令速查
# 扫描
npm audit --registry=https://registry.npmjs.org
# PR-1
npm uninstall babel-preset-env big qiniu-webpack-plugin node-sass-js-importer
npm audit fix --registry=https://registry.npmjs.org
# PR-2
npm install axios@1.8.0 qs@6.14.0 lodash-es@4.17.23 nanoid@3.3.8
# 构建验证
npm run build:b2c && npm run build:bbc
执行过程中遇到问题,将现象与 npm audit 新数字更新到 §六 进度表及 dependabot-remediation.md。