60 lines
1.7 KiB
Go
60 lines
1.7 KiB
Go
package routes
|
||
|
||
import (
|
||
"encoding/json"
|
||
)
|
||
|
||
// sensitiveKeys 需要从 event_logging payload 中剥离的字段。
|
||
// 逆向自 Claude Code v2.1.92:
|
||
// - baseUrl/baseURL — c8().BASE_API_URL,暴露 ANTHROPIC_BASE_URL(网关地址)
|
||
// - api_base_url — 备选 API base 字段名
|
||
// - serverUrl — MCP/WebSocket 服务器地址
|
||
// - gateway — 网关标识
|
||
// - apiHostRequestHeaders — 上游请求头(含 Host)
|
||
var sensitiveKeys = map[string]struct{}{
|
||
"baseUrl": {},
|
||
"baseURL": {},
|
||
"api_base_url": {},
|
||
"serverUrl": {},
|
||
"gateway": {},
|
||
"apiHostRequestHeaders": {},
|
||
}
|
||
|
||
// sanitizeEventBatch 清理 event_logging batch payload 中的敏感字段,
|
||
// 防止网关地址泄露,同时保持遥测流量正常(避免"零遥测"异常触发检测)。
|
||
//
|
||
// 实现:反序列化 → 递归删除任意深度的敏感 key → 重新序列化。
|
||
// 单次解析+序列化,比 N×M 次 gjson/sjson 操作更高效。
|
||
func sanitizeEventBatch(body []byte) []byte {
|
||
var payload interface{}
|
||
if err := json.Unmarshal(body, &payload); err != nil {
|
||
return body // 非法 JSON 原样转发,不阻塞
|
||
}
|
||
|
||
stripKeys(payload)
|
||
|
||
out, err := json.Marshal(payload)
|
||
if err != nil {
|
||
return body
|
||
}
|
||
return out
|
||
}
|
||
|
||
// stripKeys 递归遍历任意 JSON 结构,删除匹配 sensitiveKeys 的字段。
|
||
func stripKeys(v interface{}) {
|
||
switch node := v.(type) {
|
||
case map[string]interface{}:
|
||
for k := range node {
|
||
if _, hit := sensitiveKeys[k]; hit {
|
||
delete(node, k)
|
||
} else {
|
||
stripKeys(node[k])
|
||
}
|
||
}
|
||
case []interface{}:
|
||
for _, item := range node {
|
||
stripKeys(item)
|
||
}
|
||
}
|
||
}
|