Skip to content

Commit fc25a4a

Browse files
committed
fix(ai-gateway): 安全/熔断路径静默放行补 warning 日志(prompt_guard/input_validation/key 轮换/熔断标记)
1 parent 97d9f27 commit fc25a4a

3 files changed

Lines changed: 26 additions & 7 deletions

File tree

‎server/ai-gateway/middleware/input_validation.py‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,13 @@ async def dispatch(self, request: Request, call_next):
8787
content={"detail": validation_error},
8888
)
8989
except Exception:
90-
# JSON 解析失败交给后续路由处理
91-
pass
90+
# JSON 解析失败交给后续路由处理。
91+
# GW-SEC: 校验路径异常留痕——静默放行会让长度校验被绕过
92+
# 而不可观测(2026-08 审计 C7)。
93+
logger.warning(
94+
"InputValidation 异常已放行(校验路径需人工关注): path=%s",
95+
request.url.path,
96+
)
9297

9398
return await call_next(request)
9499

‎server/ai-gateway/middleware/prompt_guard.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,14 @@ async def dispatch(self, request: Request, call_next):
9494
},
9595
)
9696
except Exception:
97-
# JSON 解析失败或其他异常,交给后续中间件处理
98-
pass
97+
# JSON 解析失败或其他异常,交给后续中间件处理。
98+
# GW-SEC: 安全检测路径的异常必须留痕——静默放行会让注入检测被绕过
99+
# 而不可观测(2026-08 审计 C7)。
100+
user_id = getattr(request.state, "user_id", "unknown")
101+
logger.warning(
102+
"PromptGuard 检测异常已放行(安全路径需人工关注): user=%s, path=%s",
103+
user_id, request.url.path,
104+
)
99105

100106
return await call_next(request)
101107

‎server/ai-gateway/providers/base_provider.py‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,12 @@ async def wrapper(self, *args, **kwargs):
7575
if rotate is not None:
7676
await rotate()
7777
except Exception:
78-
# 轮询失败不阻断业务调用(保持原行为)
79-
pass
78+
# 轮询失败不阻断业务调用(保持原行为);
79+
# GW-SEC: 补日志留痕,避免 Key 轮换异常完全静默(2026-08 审计 C7)
80+
logger.warning(
81+
"Provider %s key rotation failed (business call proceeds)",
82+
self.__class__.__name__,
83+
)
8084

8185
last_error: Exception | None = None
8286
for attempt in range(max_retries + 1):
@@ -130,7 +134,11 @@ def _mark_current_key_unavailable(provider_obj) -> None:
130134
if pool is not None and api_key:
131135
pool.mark_unavailable(api_key)
132136
except Exception:
133-
pass
137+
# GW-SEC: Key 熔断标记失败时留痕(否则熔断联动失效不可观测,2026-08 审计 C7)
138+
logger.warning(
139+
"Key unavailable marking failed for provider=%s",
140+
getattr(provider_obj, "provider_name", "unknown"),
141+
)
134142

135143

136144
class AIProvider(ABC):

0 commit comments

Comments
 (0)