模块 3 · 防护与审计

input_guard 限流注入、
审计中间件(audit_middleware.py)留痕

用户消息进 LLM 前要经过 input_guard; 每个 HTTP 请求经过 审计中间件(audit_middleware.py) 写访问审计。鉴权 403 还会双写 audit_log + input_guard_log(平台线部分跳过 ENUM 限制)。

input_guard 三类检查

prompt_injection

黑名单短语(「忽略上文」「system prompt」等)→ 拒答 + 落库 guard_type=injection

oversize

业务上限 4000 字(guard 层判定才能留痕;Pydantic 硬顶只防 DoS)

rate_limit

check_rate_limit(agent_type, actor_id) 超限 → AUTH 类拒绝 + 限流日志

群聊:恶意输入被拦下

对话 HTTP 入口(chat.py)+ 审计中间件(audit_middleware.py)
if not input_guard.check_rate_limit(agent_type, auth.actor_id):
    insert_input_guard_log(..., guard_type=GUARD_RATE_LIMIT)
    raise ApiError(...)

verdict = input_guard.inspect_message(message)
if verdict.reject:
    insert_input_guard_log(..., guard_type=verdict.guard_type)

# 应用入口(main.py)挂载
async def audit_middleware(request, call_next):
    # INSERT audit_log 单请求访问记录
白话

先发消息前查频率:同 actor 刷太快就拒,并记限流日志。

再扫内容:注入/超长命中就不调 LLM,直接拒答+留痕。

审计中间件(audit_middleware.py)包在更外层:每个 HTTP 进来都记一条访问审计。

模块鉴权(deps.py).deny 鉴权失败也会双写——平台 agent_type 时 input_guard_log 可能跳过 ENUM 限制。

用户粘贴 5000 字,要在哪一层拦截才能落 input_guard_log?

审计中间件(audit_middleware.py)和 input_guard 的关系?