Appearance
如何构建安全高效的文件上传与云存储方案
解决文件上传中的安全漏洞与性能瓶颈:通过预签名 URL 减轻服务器压力,利用 Magic Bytes 校验文件真实类型,并防止路径穿越攻击,构建企业级的云存储集成方案。
为什么需要这个技能
在开发包含文件上传功能的应用时,开发者很容易掉入几个严重的陷阱:过度信任用户提供的文件后缀导致恶意软件上传、直接将大文件通过服务器中转导致内存溢出、或直接使用用户提供文件名导致系统文件被覆盖(路径穿越)。
本技能旨在提供一套标准的安全实践,教你如何将文件处理逻辑从服务器移交给云存储(如 AWS S3 或 Cloudflare R2),并确保在文件进入存储桶之前经过严格的校验和清理。
适用场景
- 构建用户头像上传、文档管理系统或多媒体分享平台。
- 需要集成 S3 协议存储且对上传性能有较高要求。
- 需要处理 GB 级大文件上传,且不能阻塞主进程。
- 需要实现私有文件临时访问(通过预签名 URL)。
核心工作流
- 绕过服务器中转:优先使用预签名 URL(Presigned URLs),让客户端直接将文件上传至云存储,避免服务器成为带宽瓶颈。
- 强制类型校验:不依赖文件后缀或
Content-Type头部,使用file-type等库检查文件的 Magic Bytes(魔数)以验证真实格式。 - 文件名脱敏:禁止使用用户原始文件名。使用
path.basename()提取基础名称并结合crypto.randomUUID()生成随机文件名,彻底杜绝路径穿越攻击。 - 资源限额控制:在服务端和客户端同步设置
maxFileSize限制,防止攻击者通过超大文件导致存储费用激增或服务崩溃。 - 流式处理:处理必须经过服务器的文件时,采用 Stream 流式传输,绝不将整个文件读入内存 Buffer。
typescript
// 示例:通过 Magic Bytes 校验真实文件类型
import { fileTypeFromBuffer } from "file-type";
async function validateImage(buffer: Buffer) {
const type = await fileTypeFromBuffer(buffer);
const allowedTypes = ["image/jpeg", "image/png", "image/webp"];
if (!type || !allowedTypes.includes(type.mime)) {
throw new Error("Invalid file type");
}
return type;
}下载和安装
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐