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) } } }