Skip to content

LogInterceptor 记录完整 HTTP 请求 body,可能把 LLM prompt / 备份文件元数据写进日志 #41

Description

@yunkst

文件: lib/services/api_service_wrapper.dart:111-119

问题: ApiServiceWrapper.init() 给 _dio 加的 LogInterceptor 设了 requestBody: true

_dio.interceptors.add(LogInterceptor(
  requestBody: true,
  responseBody: false,
  logPrint: (obj) => LoggerService.instance.d('[API] $obj', ...),
));

为什么是质量/隐私问题:

  • requestBody 会在每条 API 请求日志里序列化完整 body。客户端涉及 body 的接口至少包括:
    • POST /api/text2img/generate —— 用户 prompt / negativePrompt;
    • POST /api/image-to-video/generate —— 用户 prompt + 上传图片的 multipart(base64 字节);
    • POST /api/backup/upload —— 用户整库备份 .db 文件(multipart 路径形式);
    • POST /api/logs/upload —— 本来就用于上报日志,log_reporter_service 又走自己的 Dio,没被这个 interceptor 影响。
  • 这些 prompt 包含用户阅读偏好、创作意图、角色设定等敏感上下文;
  • 同时日志通过 LogReporterService 上报到自配后端,理论上任何 backend_host 配置都会把这些 prompt 同步带过去;
  • 当 release 模式下 log level 被调成 debug 用于排查时,等于把用户输入悄悄发出去。

修复建议: 至少对 text2img/image-to-video 两条路径排除 body 记录(基于 path 前缀过滤);最稳妥是把 requestBody 改成 false,调试时通过单独的 debugPrint/临时开关打开。


忽略指南:在 lib/services/api_service_wrapper.dart:111 添加注释 // cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions