问题描述
1. 文件上传无大小限制
文件: backend/packages/app/src/windup_app/web/api/media.py:24
整个文件一次性读入内存,没有大小校验。攻击者上传多 GB 文件可导致 OOM。
2. 同步阻塞事件循环
同文件第 31 行,service.upload(data, metadata) 是同步调用,在 async def handler 中直接执行,会阻塞整个事件循环,影响所有并发请求。
3. Content-Type 校验不足
第 21 行仅检查 file.content_type.startswith("image/"),这是客户端可伪造的 header,没有对文件内容做 magic-byte 验证。
建议修复
- 大小限制: 读取前检查
file.size,或分块读取并累加大小,超限时中止。
- 异步上传: 使用
asyncio.to_thread() 或异步 SDK 包装同步上传调用。
- 内容校验: 在大小校验通过后,检查文件头的 magic bytes(如 PNG
\x89PNG、JPEG \xFF\xD8)。
影响
- 严重程度: High
- OOM → 服务不可用(DoS)
- 阻塞事件循环 → 所有请求延迟飙升
问题描述
1. 文件上传无大小限制
文件:
backend/packages/app/src/windup_app/web/api/media.py:24整个文件一次性读入内存,没有大小校验。攻击者上传多 GB 文件可导致 OOM。
2. 同步阻塞事件循环
同文件第 31 行,
service.upload(data, metadata)是同步调用,在async defhandler 中直接执行,会阻塞整个事件循环,影响所有并发请求。3. Content-Type 校验不足
第 21 行仅检查
file.content_type.startswith("image/"),这是客户端可伪造的 header,没有对文件内容做 magic-byte 验证。建议修复
file.size,或分块读取并累加大小,超限时中止。asyncio.to_thread()或异步 SDK 包装同步上传调用。\x89PNG、JPEG\xFF\xD8)。影响