- 原缺陷:vision 适配器把 http(s) URL **原样转给上游 provider**,而 upload 返回的是同源局域网地址 ⇒ 云 provider 根本取不到 ⇒ **B1(大图绕开 WS 4096 字节上限)在自部署形态下等于没做** - 修法:① `imageURL` → `localizeRef`:**彻底不再直传 URL**;同源 upload 产物走**本地读取**, 其余 http(s) 由服务端自己取回 → 一律内联为 `data:` URI 再交 provider(OpenAI 与 Anthropic 双协议都能收图) - 顺手修「类型瞎猜」:新增 `vision/mime.go`,**字节嗅探是唯一裁决**——判得出白名单光栅图就用字节结果; 字节是文本(HTML/PROXY 错误页、SVG)→ `ErrNotImage`;判不定但来源明确声明 `image/*` 才采信声明。 错误信息只含类型名,**不含响应体/URL**(不打印图片内容) - 防护:取回复用既有 http/https 白名单 + 50MiB 上限,新增 **30s 取回超时**; 本地读取路径 `localUploadPath` 严格认定 `<host>/api/v1/files/<name>`(无 query/fragment、单段路径)+ 32 位小写十六进制名 + `filepath.Dir` 包含性第二道 ⇒ `../`、`%2e%2e%2f`、反斜杠等编码变体在触碰 FS 前即拒 - 生产接线(主会话补):`cmd/cyrene/vision.go` 传 `vision.WithUploadsDir(<DataDir>/uploads)` - 复核:build/vet 绿;新增 51 条断言(含 httptest 真取回 → 断言上游收到 data URI 且不含源 URL、 同源 upload 用不可达 host 证明走本地、HTML 谎报 image/png 被字节否决、越界名 19 例); **3 条变异反证**(恢复 URL 直传 8 红 / 文本静默回退 png 红 / 去掉穿越检查 12 红)均已还原 - 未做(已登记):历史里 URL 形态图片每轮重新取回(缓解=持久化时内联/缓存); Anthropic 只认 png/jpeg/gif/webp 而白名单含 bmp;`fetchURL` 无 IP 过滤(链路本地 169.254.169.254 可达)→ 需收紧
26 lines
1.2 KiB
Go
26 lines
1.2 KiB
Go
package vision
|
|
|
|
import "errors"
|
|
|
|
// vision 包返回的哨兵错误。每个错误向外传递时都以 %w
|
|
// 包装,使调用方能按类别判断,同时保留原始原因。
|
|
var (
|
|
// ErrNoImage 在图像来源字符串为空时返回。
|
|
ErrNoImage = errors.New("vision: empty image source")
|
|
// ErrNotConfigured 在适配器未设置 endpoint/model 时返回。
|
|
ErrNotConfigured = errors.New("vision: adapter not configured")
|
|
// ErrUnsupportedSource 在图像来源无法处理时返回。
|
|
ErrUnsupportedSource = errors.New("vision: unsupported image source")
|
|
// ErrFetch 在 URL 图像无法下载时返回。
|
|
ErrFetch = errors.New("vision: cannot fetch image")
|
|
// ErrUpstream 在 vision/OCR 提供方请求失败时返回。
|
|
ErrUpstream = errors.New("vision: upstream request failed")
|
|
// ErrBadImage 在图像无法读取或解码时返回。
|
|
ErrBadImage = errors.New("vision: cannot read image")
|
|
// ErrNotImage 在来源声明的类型与真实字节都判不出图像时返回
|
|
// (例如把 HTML/PROXY 错误页当成图片送进模型)。
|
|
ErrNotImage = errors.New("vision: source is not an image")
|
|
// ErrBadArgs 在工具参数格式错误时由该工具返回。
|
|
ErrBadArgs = errors.New("vision: bad tool arguments")
|
|
)
|