"""P2:request_id 头校验——安全字符集白名单(字母数字 . _ -,1–128 位),非法则生成新 uuid。 放行 uuid.hex / 常见 trace id / 客户端自定义短 id;丢弃含空白/控制字符/换行/注入序列/ 超长(>128)的值,防止把未经校验的客户端值原样写进日志/响应头(日志注入防护)。 """ from __future__ import annotations import re from ww_api.middleware import _sanitize_request_id _HEX_32 = re.compile(r"^[0-9a-f]{32}$") def test_valid_hex_passthrough() -> None: raw = "a" * 32 assert _sanitize_request_id(raw) == raw def test_valid_uppercase_hex_passthrough() -> None: raw = "ABCDEF0123456789" assert _sanitize_request_id(raw) == raw def test_none_generates_new_uuid() -> None: out = _sanitize_request_id(None) assert _HEX_32.match(out) def test_short_alnum_passthrough() -> None: # 客户端自定义短 id(如 'abc123')属合法字符集 → 原样透传(与 /health 传播契约一致)。 raw = "abc123" assert _sanitize_request_id(raw) == raw def test_too_long_rejected() -> None: out = _sanitize_request_id("a" * 129) # 129 位 > 128 上限 → 丢弃改生成。 assert _HEX_32.match(out) def test_whitespace_rejected() -> None: # 含空格(日志注入风险,非白名单字符)→ 丢弃改生成。 out = _sanitize_request_id("abc 123") assert out != "abc 123" assert _HEX_32.match(out) def test_injection_rejected() -> None: # 含非十六进制字符(注入/控制字符)→ 丢弃改生成。 out = _sanitize_request_id("../../etc/passwd\n") assert "/" not in out assert "\n" not in out assert _HEX_32.match(out)