Skip to content

Go 模型广场代理(SSRF 防护)

系统概览

模型广场(Plaza)的本地代理服务(proxy.go,867 行)。起本地 HTTP/HTTPS 代理转发到用户配置的广场站点,注入前端脚本改造页面(plazaInjectScript),支持会话 cookie 隔离、WebSocket 升级转发、限流与下载专用通道DownloadFromPlaza)。安全重点是防 Open Proxy 与 SSRF。

核心职责

  • StartProxy(target, mode) — 起本地代理(按模式注入桥接脚本,直连/代理两模式),返回本地 URL。
  • StopProxy() — 停代理并清理会话。
  • plazaSSRFGuard + isBlockedIP — DialContext 拦截私有网段/环回 IP,防 SSRF。
  • proxyWebSocket — WebSocket 升级转发(含 cookie)。
  • DownloadFromPlaza(fileURL, fileName) — 经代理会话下载资源(限 1GiB,进度上报)。
  • handlePlazaDownloadPost / handlePlazaUrlPost — 前端回调端点。

对外 API(节选)

  • StartProxy(target, mode string) (string, error) — 绑定 StartProxy,返回 http://127.0.0.1:<port>/
  • DownloadFromPlaza(fileURL, fileName) (*PlazaDownloadResult, error) — 广场下载。
  • StopProxy() error — 清理。

与其他子系统关系

  • 被前端 plaza-browser.ts / plaza-download.ts 调用。
  • go-plaza.md(窗口预热/导航)配合;下载目标经 go-watch.md/zipextract 入库。

前端接入入口

  • 模型广场:plaza-browser.ts(启动代理)、plaza-download.ts(下载)、plaza-state.ts

不变量

  • 代理只转发配置的白名单广场源;任何用户自定义 target 都必须过 SSRF 校验。
  • 私有/环回/链路本地 IP 一律拒绝,DNS rebinding 由 DialContext 层兜底。
  • 下载与页面体大小上限不可移除(磁盘/内存保护)。

验证入口

  • 测试:internal/app/proxy_test.go
  • 命令:go test ./internal/app/ -run "Proxy|SSRF|Blocked"