Skip to content

fix(api): media 上传无大小限制且阻塞事件循环 #201

Description

@xiaocheny214

问题描述

1. 文件上传无大小限制

文件: backend/packages/app/src/windup_app/web/api/media.py:24

data = await file.read()

整个文件一次性读入内存,没有大小校验。攻击者上传多 GB 文件可导致 OOM。

2. 同步阻塞事件循环

同文件第 31 行,service.upload(data, metadata) 是同步调用,在 async def handler 中直接执行,会阻塞整个事件循环,影响所有并发请求。

3. Content-Type 校验不足

第 21 行仅检查 file.content_type.startswith("image/"),这是客户端可伪造的 header,没有对文件内容做 magic-byte 验证。

建议修复

  1. 大小限制: 读取前检查 file.size,或分块读取并累加大小,超限时中止。
  2. 异步上传: 使用 asyncio.to_thread() 或异步 SDK 包装同步上传调用。
  3. 内容校验: 在大小校验通过后,检查文件头的 magic bytes(如 PNG \x89PNG、JPEG \xFF\xD8)。

影响

  • 严重程度: High
  • OOM → 服务不可用(DoS)
  • 阻塞事件循环 → 所有请求延迟飙升

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0优先级 P0(最高,先做)bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions