fix(deps): xlsx → @e965/xlsx@0.20.3(消除两处已知 high 供应链漏洞)
背景:npm 上的 xlsx 永久冻结在 0.18.5(SheetJS 已停止向 npm 发布),该版本含 CVE-2023-30533(原型污染,0.19.3 修复)与 CVE-2024-22363(ReDoS,0.20.2 修复)两处 high, 而 npm 上**不存在**修复版本——官方修复版只发自家 CDN。 选型判据=CDN 可达性:本机实测 cdn.sheetjs.com 不可达(curl rc=35 schannel 吊销离线; --ssl-no-revoke 后 rc=28 超时),采用官方 CDN tarball 会把「依赖能否装上」变成部署单点。 故改用 npm 上忠实转发官方 CDN 构建的 @e965/xlsx(0.20.3,含上述两处修复、零依赖、 API 与 xlsx 全等)。未选 exceljs:其 API 完全不同,11 个调用点需全量重写且写入变异步, 风险直接落在承载生产导入路径的代码上。 - package.json:xlsx@^0.18.0 → @e965/xlsx@^0.20.3 - app/service/admin.js(成绩导出 / 客观题模板 / 报名表导入 / 客观题导入) app/service/bigQuestion.js(综合大题模板 / 综合大题导入):仅改 require 包名, 业务逻辑零改动(共 6 条路径 / 11 个调用点) - package-lock.json:移除 xlsx 及其 7 个传递依赖(cfb/codepage/ssf/wmf/word/adler-32/frac), 净 −7 包 验证:API 面 + 写读往返 PASS;差分测试 24/24(含畸形尺寸样本与 201 行模板); 真实 HTTP 回归 6 条路径 PASS(写 3/3 均 PK 头、读 3/3 正效应且落库计数吻合); 跨库往返 6/6;npm audit 中 xlsx 命中【无】(backend high 23 → 22)。
This commit is contained in:
@@ -3,7 +3,9 @@
|
||||
const Service = require('egg').Service;
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const XLSX = require('xlsx');
|
||||
// 2026-10-10 换库:理由同 service/bigQuestion.js —— npm 上 `xlsx` 冻结在 0.18.5(两处 high CVE),
|
||||
// 官方修复版仅在不可达的 cdn.sheetjs.com ⇒ 改用零依赖、API 一致的 `@e965/xlsx@0.20.3`。
|
||||
const XLSX = require('@e965/xlsx');
|
||||
const {
|
||||
buildAggregationKeyMap,
|
||||
resolveAggregationKeysForContestant,
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
const Service = require('egg').Service;
|
||||
const XLSX = require('xlsx');
|
||||
// 2026-10-10 换库:npm 上的 `xlsx` 永久冻结在 0.18.5(含 CVE-2023-30533 原型污染 +
|
||||
// CVE-2024-22363 ReDoS,且 npm 无修复版本)。SheetJS 官方把修复版只发自家 CDN,
|
||||
// 而 cdn.sheetjs.com 在部署环境不可达 ⇒ 改用 npm 上忠实转发官方 CDN 构建的
|
||||
// `@e965/xlsx`(0.20.3,含两处修复,零依赖,API 与 xlsx 完全一致)。
|
||||
const XLSX = require('@e965/xlsx');
|
||||
|
||||
/**
|
||||
* 综合大题服务 - BigQuestionService
|
||||
|
||||
Reference in New Issue
Block a user