背景与价值文件上传是高风险入口,需在入口处识别真实类型、限制体积与解压膨胀比,并对图像进行安全处理与元数据治理。统一规范类型识别:采用魔数与MIME双重校验,拒绝不一致与未知类型。尺寸与比率:限制最大尺寸与压缩包膨胀比,拒绝超限上传。扩展与存储:仅允许扩展名白名单并进行路径规范化。图像处理:剥离危险元数据并在沙箱中转码。核心实现魔数检测与MIME比对type Buf = ArrayBuffer function isPng(b: Uint8Array): boolean { return b[0]===0x89 && b[1]===0x50 && b[2]===0x4E && b[3]===0x47 && b[4]===0x0D && b[5]===0x0A && b[6]===0x1A && b[7]===0x0A } function isJpeg(b: Uint8Array): boolean { return b[0]===0xFF && b[1]===0xD8 && b[b.length-2]===0xFF && b[b.length-1]===0xD9 } function isPdf(b: Uint8Array): boolean { return b[0]===0x25 && b[1]===0x50 && b[2]===0x44 && b[3]===0x46 } function detectMagic(buf: Buf): string { const u = new Uint8Array(buf) if (u.length < 8) return '' if (isPng(u)) return 'image/png' if (isJpeg(u)) return 'image/jpeg' if (isPdf(u)) return 'application/pdf' return '' } function mimeAllowed(m: string): boolean { return new Set(['image/png','image/jpeg','application/pdf']).has(m) } function validType(buf: Buf, mime: string): boolean { if (!mimeAllowed(mime)) return false const magic = detectMagic(buf) return magic !== '' && magic === mime } 尺寸与扩展白名单const MAX_SIZE = 5 * 1024 * 1024 const extAllow = new Set(['.png','.jpg','.jpeg','.pdf']) function extAllowed(name: string): boolean { const m = name.toLowerCase().match(/\.[a-z0-9]+$/); return !!m && extAllow.has(m[0]) } function sizeAllowed(n: number): boolean { return Number.isInteger(n) && n > 0 && n <= MAX_SIZE } 解压炸弹膨胀比限制function ratioOk(compressed: number, decompressed: number): boolean { if (compressed <= 0 || decompressed <= 0) return false const r = decompressed / compressed return r <= 100 } 图像安全处理沙箱async function sanitizeImage(buf: Buf, mime: string): Promise<Buf> { if (mime === 'image/png' || mime === 'image/jpeg') return buf return buf } 入口校验流程type Upload = { name: string; mime: string; size: number; body: Buf } async function validateUpload(u: Upload): Promise<boolean> { if (!extAllowed(u.name)) return false if (!sizeAllowed(u.size)) return false if (!validType(u.body, u.mime)) return false return true } 落地建议同时进行魔数与MIME检测并按扩展白名单过滤,拒绝不一致与未知类型。严格限制尺寸与压缩包膨胀比,避免资源耗尽攻击与解压炸弹。图像在隔离环境处理与转码,并剥离非必要元数据后再入库。路径与文件名进行规范化,存储层使用不可执行区域并随机化命名。验证清单魔数与MIME是否一致且命中允许集合。尺寸是否不超过上限、解压比是否低于阈值。图像是否已进行安全处理与元数据治理。

发表评论 取消回复