Expand description
SSRF 防护的 URL 抓取(服务端按图,供 MCP upload_media 工具)。
SSRF 防护的 URL 抓取:服务端按图,供 MCP upload_media(url) 工具使用。
这是 Option B 的第三通道——LLM 自身(不经 host/shell)绕过 base64 的唯一方式:
工具只收 url: String(JSON-RPC 纯文本),服务端去抓二进制,二进制从不进 JSON-RPC。
§SSRF 防护(多层纵深)
- 仅 https:拒绝 http:// 与其它 scheme(公共图床几乎都走 https; 限 scheme 是最低成本的最大攻击面收敛)。
- 解析即锁定 IP:先用
std::net::ToSocketAddrs解析主机名,逐个 IP 做 私网/回环/链路本地/保留段校验,只把通过校验的 IP 经 reqwest 的.resolve(host, ip)钉死——reqwest 不再二次 DNS 查询,杜绝 DNS rebinding (解析时返回公网 IP 骗过校验,连接瞬间返回内网 IP 的攻击)。 - 禁重定向:302 可重定向到内网 IP 绕过白名单——设
redirect(Policy::none), 抓取器对每个跳转点零信任。 - 体积上限:流式读 + 累计字节,超过
MAX_FILE_SIZE立即中止,避免无界 响应(Content-Length 可伪造、可缺省)撑爆内存。 - 超时:连接 + 整体读取封顶,防慢速 loris 式拖挂。
- 白名单兜底:最终交给
process_image_upload,magic bytes 二次验真, Content-Type 不被信任。
抓取在异步 reqwest 中执行(不阻塞 worker;转码/校验仍走 spawn_blocking)。
仅 feature = "server" 编译。
Enums§
- Fetch
Error 🔒 - URL 抓取错误(脱敏,映射到 MCP invalid_request / internal_error)。
Functions§
- fetch_
and_ 🔒ingest - 抓取 URL → 图片字节 → 走共享入库流水线 → 返回
/uploads/...结果。 - is_
forbidden_ 🔒ip - SSRF 拒绝:私网 / 回环 / 链路本地 / 保留 / CGNAT 等非公网单播段。