Files

325 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 依赖漏洞修复执行方案
> 制定时间2026-07-15
> 基线扫描:`npm audit --registry=https://registry.npmjs.org` → **174 项**Critical 34 / High 77 / Moderate 42 / Low 21
> 关联文档:[dependabot-remediation.md](./dependabot-remediation.md)
> Dependabothttps://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 行:
```diff
- const QiniuPlugin = require('qiniu-webpack-plugin')
```
### 2.3 执行命令
```bash
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 验证
```bash
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 升级专项(风险最高)
**执行:**
```bash
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 升级
```bash
npm install qs@6.14.0
```
**文件:**
- `src/api/request/index.js`
- `src/utils/fetch.js`
- `src/api/shipping.js`
**回归:** 带复杂 query 的列表筛选、数组参数序列化。
### 3.4 其余小版本
```bash
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.vue`
- `src/views/dashboard/merchant-dashboard.vue`
- `src/view/mall/datacube/companydata/order.vue`
### 3.5 PR-2 验证命令
```bash
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`
**方案:**
```bash
npm uninstall xlsx
npm install -D exceljs
```
重写 `build/update_i18n_from_excel.js` 读写逻辑(仅开发脚本,不影响生产包体积若放 devDependencies
**替代**:若脚本使用频率极低,可改为手动维护 JSON直接删除 xlsx。
### 4.2 sass 构建链
项目已用 `sass`dart-sass可升级 loader
```bash
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 仍多,追加:
```json
"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"
}
```
```bash
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 验证
```bash
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](./dependabot-accept-list.md) |
**每次 PR 合并后执行:**
```bash
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 建议(修复完成后)
```yaml
# .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 完成后改为阻断。
---
## 十、快速命令速查
```bash
# 扫描
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](./dependabot-remediation.md)。*