Appearance
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"。