Vibe Coding 不可信资源入口:统一验收上传、URL、路径与 SSRF
上传文件、导入 URL 和读取路径最终都会让服务处理攻击者选择的资源。本文用统一资源状态机约束字节、位置、解析与归属,再分别验证文件、归档、路径、DNS 和重定向边界。
本文要点
- 主题聚焦:AI、Vibe Coding、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
“支持从本地上传,也支持粘贴 URL,顺便允许选择服务器上的模板文件”常被 AI 实现成三个 handler:一个接收 multipart,一个直接 fetch(url),一个 join(base, path)。它们看似不同,实际都在回答同一问题:攻击者能否让服务取得并解释一份原本不应处理的资源。若三条路径各自零散校验,最宽松的一条会绕过其他门禁。
Next.js AI 文件上传安全流水线深入处理 Next.js、对象存储与 AI 解析链;Agent 网络出口防护聚焦 Agent 工具的 DNS 与出网。本篇面向一般 Vibe Coding 功能,建立跨上传、URL、路径和归档都一致的验收合同。
先统一资源状态和身份
每次导入生成服务端 resource_id,绑定发起主体、租户、入口类型、策略版本、声明大小、取得时间、字节摘要和保留期限。状态按 requested -> acquired -> quarantined -> validated -> parsed -> published 推进;任何失败进入带原因的隔离/拒绝态。只有 published 派生物可被业务查询,原始对象不可因“已经上传成功”直接公开。
字节取得与内容解释分离。取得层限制并发、网络读取字节、总时长和重定向;验证层识别真实格式、大小与归档结构;解析层在低权限、受 CPU/内存/时间和出网约束的 worker 中运行。每阶段读取同一不可变版本和摘要,防止验证 A、解析 B。最终资源继承租户和授权,不用随机对象键代替访问控制。
上传和归档要限制展开后的世界
浏览器提供的文件名、扩展名、MIME 和大小都不可信。服务端限制允许类型、真实字节数、文件特征、文件数量、页数/像素、解析时间和解压后总量;扫描器版本、解析器版本和结果写入 receipt。未知、加密、损坏或包含不支持活动内容的文件默认隔离,不让 AI “尽量读取”后静默放行。
归档成员名可能包含绝对路径、..、重复分隔符、Unicode 混淆或链接。先在内存/清单层规范化每个成员,拒绝绝对路径、逃逸根目录、符号/硬链接和超出数量/展开预算的集合,再写入新建隔离目录。规范化后还要确认目标位于批准根下,避免仅做字符串前缀比较。批量表格通过安全扫描后的语义导入可接运营 CSV 导入对账,不能把“文件安全”和“业务行合法”混为一步。
URL 抓取要验证每一次实际连接
若业务只需少数供应商,优先使用 scheme、主机和端口 allowlist;任意 URL 预览风险更高,需要明确理由。只允许所需的 HTTP(S),拒绝嵌入凭证、非常规端口和含糊地址表示。解析 DNS 后检查所有候选地址,阻断 loopback、私网、链路本地、文档/保留网段和云元数据目标;IPv4、IPv6 与映射地址都要覆盖。
“先解析检查、随后库按 hostname 再解析”存在检查与连接不一致。连接器应绑定已验证地址,同时保留正确 Host/TLS 身份,并限制响应字节和时间。每个重定向重新解析、重新授权,限制次数,禁止 HTTPS 降级;不能因为首个域名在 allowlist 就信任它指向的 Location。应用层检查之外再用网络出站策略阻断内部范围,形成独立边界。
URL 内容仍走同一 quarantine、摘要和解析流程。远端声称的 Content-Type、文件名与长度只是提示;流式读取达到预算立即终止。抓取失败、超时和部分响应不得被发布为完整资源。
本地路径必须是受控能力
最安全的接口接收资源 ID,而不是任意路径。确需选择服务器文件时,调用方只能选服务端生成的逻辑名,映射到固定只读根和 allowlist;不要把用户字符串直接传给文件 API。路径解码、规范化和根目录校验在同一处完成,并处理符号链接、挂载点与打开后的真实对象身份,避免检查路径后对象被替换。
下载、预览、删除和重新解析都重新做当前授权。Vibe Coding 鉴权与租户隔离提醒缓存、对象存储和 worker 同样可能串租;资源 receipt 中的发起者不是永久授权。删除时先阻断新读取,再让在途任务看到撤销代际,防止迟到结果复活。
用一张恶意输入矩阵验收
矩阵覆盖零字节、伪造类型、超限流、压缩膨胀、逃逸成员、符号链接、解析超时、URL 私网/IPv6/重定向、DNS 结果变化、路径编码、跨租户资源 ID、解析中删除和重复确认。按Vibe Coding 测试矩阵为每例断言状态、实际网络/文件访问、落盘范围、队列、副作用、日志和清理结果,而不只检查错误码。
再从Vibe Coding 请求路径追踪确认没有旁路 handler 直接读取原始对象。故意移除重定向复核、根目录检查或发布状态门时,目标测试必须失败。验收报告绑定策略、解析器与网络环境版本,无法测试的格式或地址族保持禁用。
上传、URL 和路径不是三个“加个校验”的表单功能,而是三种资源取得能力。统一身份、状态、预算、隔离和授权,再对各自特有的字节、文件系统与网络边界做负向证明,才能让 AI 扩展入口而不扩大未知读取能力。
Related