Skip to content

fix(设备管理): 限制物模型导入使用托管文件 - #780

Merged
zhou-hao merged 2 commits into
2.12from
codex/fix-ssrf-766
Aug 6, 2026
Merged

fix(设备管理): 限制物模型导入使用托管文件#780
zhou-hao merged 2 commits into
2.12from
codex/fix-ssrf-766

Conversation

@zhou-hao

@zhou-hao zhou-hao commented Aug 6, 2026

Copy link
Copy Markdown
Member

目的

  • 修复属性物模型导入可通过 fileUrl 发起任意远程请求或读取本地路径的问题
  • 将业务请求中的导入数据源收敛到平台 FileManager 托管文件,保留上传后导入流程
  • 统一托管文件读取入口,避免各业务模块重复解析文件地址

核心变动

  • io-component:在 FileUtils 新增 readManagedInputStream(FileManager, String)resolveManagedFileId(String)
  • io-component:统一入口仅解析裸文件 ID 或包含 /file/{id} 的平台文件访问地址,随后直接调用 FileManager;不会发起 HTTP 请求或读取本地路径
  • io-component:DefaultImportExportService 改用统一托管文件入口,删除内部重复解析逻辑
  • io-component:非法输入统一抛出支持 i18n 的 ValidationException
  • device-manager:产品和设备属性导入接口说明同步为“平台文件 ID 或访问地址”
  • 测试:覆盖真实流读取与关闭、绝对/相对托管访问地址解析,以及外部 URL、本地路径、畸形 URI 等输入被拒绝且不调用 FileManager

设计与测试目标

  • 设计稿:不适用;本次为边界明确的小范围安全修复
  • 用户确认:已确认,按独立 Issue 提交评审
  • 测试目标:覆盖托管文件 ID、托管访问 URL 的正常路径,以及外部 URL / 本地路径不再被直接读取的异常与回归路径
  • 注释 / 公共契约:适用;已补充 FileUtils 类级安全边界和新增公共方法契约
  • i18n:适用;新增非法托管文件输入的中英文提示
  • 数据权限:不适用;未新增资产查询或 CRUD 权限边界
  • 数据库兼容与性能:不适用;未涉及 SQL
  • 链路追踪:不适用;沿用既有导入链路,未新增业务或跨服务链路
  • MBean 运维可观测性:不适用;未新增常驻任务、缓存、队列或后台执行器

测试结果

  • 单元测试命令:mvn -pl jetlinks-components/io-component -am -Dtest=DefaultImportExportServiceTest -Dsurefire.failIfNoSpecifiedTests=false test
  • 单元测试:3 passed, 0 failed, 0 errors, 0 skipped
  • 相关模块编译命令:mvn -pl jetlinks-manager/device-manager -am -DskipTests compile
  • 相关模块编译:18 个 reactor module 全部成功
  • 覆盖率:新增 readManagedInputStream 1/1 lines(100%);resolveManagedFileId 27/27 lines(100%)、22/28 branches(78.6%)
  • 集成测试:不适用;FileManager 交互已通过单元测试替身验证,未改变数据库、消息、事件、协议或启动装配
  • 压力测试:不适用;未改变导入批处理算法
  • 补充说明:JaCoCo 0.8.7 在 JDK 21 对 Mockito 动态类提示 Unsupported class file major version 65,不影响测试结果及目标类报告生成

文档同步情况

  • 已同步:Controller OpenAPI 参数说明及 io-component 中英文错误提示
  • 无需同步长期文档:接口仍使用既有上传文件后导入流程,README 总览未发生变化

风险与说明

  • 影响范围:产品与设备属性物模型文件导入
  • 安全边界:业务请求只可通过本 PR 新增的 managed-file 专用入口访问托管文件
  • 兼容性:支持直接传文件 ID,以及绝对或相对的平台文件访问地址
  • 已知限制:历史上直接传入任意外部 URL 或本地路径的调用将失败,应先上传为平台托管文件
  • 范围边界:FileUtils 既有通用远程/本地读取能力及其全局下载策略不在本 PR 范围;本入口不会调用该能力

Closes #766

@zhou-hao
zhou-hao merged commit 8846941 into 2.12 Aug 6, 2026
2 of 3 checks passed
@zhou-hao
zhou-hao deleted the codex/fix-ssrf-766 branch August 6, 2026 11:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant