feat(auth): 登录限流 IP 取 XFF 末段(防首段轮换伪造)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -46,6 +46,21 @@ class ChangePasswordRequest(BaseModel):
|
||||
|
||||
|
||||
def _client_ip(request: Request) -> str:
|
||||
"""限流键 IP(spec 2026-10-19 §6): XFF **末段**。
|
||||
|
||||
反代模板 proxy_add_x_forwarded_for 语义 = 客户端自带 XFF 在前、反代把
|
||||
真实来源 $remote_addr 追加在尾——末段不可伪造(单跳拓扑);取首段会被
|
||||
轮换伪造绕过限流(比现状更糟)。将来加 CDN 时末段退化为 CDN IP →
|
||||
键退化为按用户名 = 现状,故障安全。无 XFF/空串/空白回退 client.host。
|
||||
|
||||
与引擎 _server_ip(取首段,"CDN 在前"拓扑假设,数据质量用途)刻意
|
||||
不对称——两者用途与威胁模型不同,不许互相"统一"(spec §6 双向注记)。
|
||||
"""
|
||||
xff = request.headers.get("x-forwarded-for", "")
|
||||
if xff.strip():
|
||||
last = xff.split(",")[-1].strip()
|
||||
if last:
|
||||
return last
|
||||
return request.client.host if request.client else ""
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user