- SSRF 三层:① 字面主机判定(**链路本地** `169.254.0.0/16`/`fe80::/10`(先 Unmap ⇒ `::ffff:169.254.169.254` 绕不过)+ 云元数据 `100.100.100.200`、`fd00:ec2::/64`);② 重定向逐跳校验 + 上限 5 跳; ③ **建连前校验解析结果并用校验过的 IP 直连**(防 DNS 重绑,拨号器不再二次解析) - **没打断同源自取**(两条独立证据):`127.0.0.1:<port>/api/v1/files/<32hex>.png` 端到端取回成功、 私网地址**原样交给底层拨号器**;被拒地址则底层拨号器 0 次调用(无真实连接发出) - 失败文案**不含 URL/查询串签名**;非图片响应仍 `ErrNotImage` 且不泄漏响应体 - base64 路径长度预检(**先于 DecodeString 与 `data:` 短路**,零分配):口径与网关同值同推导 (`((5MiB+2)/3)*4+64`),超限 `ErrImageTooLarge`、文案只含上限与本次长度 - 复核:vision 包 build/vet/测试绿(15 条新用例);**4 条变异反证**(守卫整体短路 → 8 条被拒地址全中; 只短路链路本地分支 → 4 红且实测「无守卫时进程真的去连 169.254.169.254」;预检恒 nil → 3 红; 去掉重定向校验仍全绿 ⇒ 证明第三层独立兜住) - 登记:`CHAT_IMAGE_MAX_BYTES` 调大 > 默认时「网关照放、vision 拒」的配置耦合(待单一真源对齐)
32 lines
1.7 KiB
Go
32 lines
1.7 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")
|
|
// ErrBlockedAddress 在图像 URL 指向被拒的链路本地/云元数据地址时返回
|
|
// (见 guard.go)。错误只带主机与网段原因,不带 URL 或其中的凭据。
|
|
ErrBlockedAddress = errors.New("vision: image URL points at a blocked address")
|
|
// ErrImageTooLarge 在内联图像(base64 / data: URI)字符串超过上限时返回。
|
|
// 判定在解码与短路之前完成,错误信息只带上限与本次长度。
|
|
ErrImageTooLarge = errors.New("vision: inline image is too large")
|
|
)
|