Skip to main content

Module url_fetch

Module url_fetch 

Source
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 防护(多层纵深)

  1. 仅 https:拒绝 http:// 与其它 scheme(公共图床几乎都走 https; 限 scheme 是最低成本的最大攻击面收敛)。
  2. 解析即锁定 IP:先用 std::net::ToSocketAddrs 解析主机名,逐个 IP 做 私网/回环/链路本地/保留段校验,只把通过校验的 IP 经 reqwest 的 .resolve(host, ip) 钉死——reqwest 不再二次 DNS 查询,杜绝 DNS rebinding (解析时返回公网 IP 骗过校验,连接瞬间返回内网 IP 的攻击)。
  3. 禁重定向:302 可重定向到内网 IP 绕过白名单——设 redirect(Policy::none), 抓取器对每个跳转点零信任。
  4. 体积上限:流式读 + 累计字节,超过 MAX_FILE_SIZE 立即中止,避免无界 响应(Content-Length 可伪造、可缺省)撑爆内存。
  5. 超时:连接 + 整体读取封顶,防慢速 loris 式拖挂。
  6. 白名单兜底:最终交给 process_image_upload,magic bytes 二次验真, Content-Type 不被信任。

抓取在异步 reqwest 中执行(不阻塞 worker;转码/校验仍走 spawn_blocking)。 仅 feature = "server" 编译。

Enums§

FetchError 🔒
URL 抓取错误(脱敏,映射到 MCP invalid_request / internal_error)。

Functions§

fetch_and_ingest 🔒
抓取 URL → 图片字节 → 走共享入库流水线 → 返回 /uploads/... 结果。
is_forbidden_ip 🔒
SSRF 拒绝:私网 / 回环 / 链路本地 / 保留 / CGNAT 等非公网单播段。