# 补充修复报告：不影响业务逻辑的安全加固

> **筛选原则**：只修复「正常请求路径不变、仅加固防护」的漏洞；不改权限体系、不改鉴权模型、不强制变更业务流程。  
> **完成时间**：2026-08-06  
> **编译验证**：`mvn -pl fs-common,fs-framework,fs-service,fs-user-app,fs-company,fs-qw-api,fs-admin,fs-qwhook -am compile -DskipTests` 通过  

---

## 一、本轮筛选结论

| 类型 | 是否本轮修复 | 原因 |
|------|--------------|------|
| XXE 禁用 DTD | **已修** | 仅加强 XML 解析器特性，正常企微明文 XML 不受影响 |
| Runtime.exec → ProcessBuilder | **已修** | 命令参数相同，仅调用方式更安全 |
| 禁止 html/htm 上传/下载白名单 | **已修** | HIS 业务一般不需要上传可渲染 HTML；可阻断存储型 XSS |
| 剩余裸 uploadOSS | **已修** | 复用已有白名单工具，合法类型仍可用 |
| 安全响应头 nosniff | **已修** | 仅增加响应头，不影响业务数据 |
| 知识库上传文件名清洗 | **已修** | 仅过滤危险字符，中英文名仍可用 |
| Jackson DefaultTyping 收紧 | **未改** | 可能影响 Redis 历史缓存反序列化，风险大于收益，需单独评估 |
| 后台补 `@PreAuthorize` | **未改** | 依赖权限点配置，可能造成后台 403 |
| fs-company-app `/**` permitAll | **未改** | 改动会冲击现有 `@Login` 拦截体系 |
| 跨租户 companyId 强制覆盖 | **未改** | 可能影响运营超管跨公司操作 |

---

## 二、已修复明细

### 1. XXE（中危-01 等）

| 文件 | 改动 |
|------|------|
| 新增 `fs-common/.../XmlSecurityUtils.java` | 统一禁用 DTD/外部实体 |
| `fs-qw-api/.../QwController.java` | 使用 `XmlSecurityUtils.newSafeDocumentBuilder()` |
| `fs-service/.../qwApi/util/XMLParse.java` | 补齐与官方安全示例一致的 feature |

**影响**：正常企微回调 XML 无 DOCTYPE，解析结果不变。

### 2. 命令注入（中危-03/04/05）

| 文件 | 改动 |
|------|------|
| `HuaweiVodServiceImpl` / `HuaweiObsServiceImpl` | `Runtime.exec(拼接串)` → `ProcessBuilder` 参数数组 |
| `AudioUtils`（company / qwhook / qwhook-msg / qwhook-sop / fastgptApi） | silk 编码改为 `ProcessBuilder` |
| `ProcessManager` + `LiveServiceImpl#buildFFmpegCommand` | 改为 `List<String>` 传参，路径不再被空格拆开 |

**影响**：ffmpeg / silk 参数语义不变，路径含空格时反而更稳。

### 3. 存储型 XSS / 上传（中危-07、剩余高危-08）

| 文件 | 改动 |
|------|------|
| `MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION` | **移除 `html`/`htm`**（保留 txt/文档/图片/视频/pdf） |
| `fs-qw-api/.../CommonController#uploadOSS` | 接入 `OssUploadSecurityUtils` |
| `fs-user-app/.../CommonScrmController#uploadOSS` | 接入 `OssUploadSecurityUtils` |

**影响**：若业务确有上传 `.html` 页面需求会被拒绝；常规图片/文档/音视频不受影响。

### 4. 响应头（低危 nosniff）

| 文件 | 改动 |
|------|------|
| `fs-framework/.../SecurityConfig.java` | 增加 `.headers().contentTypeOptions()` |

**影响**：仅增加 `X-Content-Type-Options: nosniff`，不影响接口数据。

### 5. 知识库文件名（中危-10）

| 文件 | 改动 |
|------|------|
| `fs-admin` / `fs-company` `ChatDatasetFileController#getFileNameWithoutExtension` | 白名单过滤危险字符，长度限制 50 |

**影响**：含特殊符号的文件名会被清洗，中英文与数字下划线不受影响。

---

## 三、明确跳过（避免影响使用）

1. **Jackson `activateDefaultTyping(LaissezFaire...)`**  
   全仓库大量 RedisConfig 使用，贸然改为白名单可能导致登录态/缓存读失败。建议单独做兼容验证后再改。

2. **垂直越权补权限注解 / 强制 companyId**  
   会改变后台可见数据范围或触发 403，需产品与权限表配合。

3. **优惠券竞态加分布式锁**  
   属逻辑增强，可能改变高并发领取时序，需业务确认。

4. **下载接口去掉客户端 `delete` 参数**  
   若前端依赖该参数清理临时文件，直接删除会改变行为；建议业务确认后改。

---

## 四、建议回归点（轻量）

1. 企微回调是否正常（XXE 加固后）  
2. 上传图片/PDF/xlsx/mp4 是否正常；确认 `.html` 被拒绝符合预期  
3. 语音转 silk / 视频 ffmpeg 合并是否正常  
4. 直播录播推流（FFmpeg List 传参）是否正常  
5. 知识库 Excel 导入文件名是否正常显示  

---

## 五、总结

本轮只做了**无感安全加固**：XXE、命令执行方式、html 上传封禁、剩余 OSS 白名单、nosniff、文件名清洗。  
不涉及鉴权模型、权限点、支付主流程、租户隔离策略，正常业务使用面基本不受影响。
