This commit is contained in:
2026-09-14 11:25:41 +08:00
parent 8dd921570f
commit 148d5bdd51
4 changed files with 16 additions and 4 deletions
+2 -2
View File
@@ -138,8 +138,8 @@ CORS_ALLOWED_ORIGINS=http://localhost:8001
# 可信代理层数 - nginx直接透传CDN的X-Forwarded-For(只传真实客户端IP,不追加)
TRUSTED_PROXY_COUNT=1
# 可信代理IP白名单 - nginx同机部署,信任本机回环地址
TRUSTED_PROXY_IPS=127.0.0.1
# 可信代理IP白名单 - CDN节点IP不固定,使用0.0.0.0信任所有来源(安全由CDN+nginx保证)
TRUSTED_PROXY_IPS=0.0.0.0
# ============================================================
+1 -1
View File
@@ -131,7 +131,7 @@ CAPTCHA_NOISE_DOTS=30
CORS_ALLOWED_ORIGINS=http://localhost:8001
# 可信代理层数 - 0=不信任X-Forwarded-For;仅部署在Nginx等反代后才设>=1
TRUSTED_PROXY_COUNT=1
# 可信代理IP白名单(逗号分隔)- nginx同机部署,信任本机回环地址
# 可信代理IP白名单(逗号分隔)- nginx同机部署填127.0.0.1;有CDN且动态边缘IP填0.0.0.0
TRUSTED_PROXY_IPS=127.0.0.1
# ============================================================
+2 -1
View File
@@ -44,7 +44,8 @@ server {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 透传上游X-Forwarded-For(不追加本机IP);无上游头时回退到直连IP
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
+11
View File
@@ -76,6 +76,12 @@ def get_client_ip(request) -> str:
Returns:
客户端IP地址
"""
# === 临时调试 ===
peer = request.client.host if request.client else 'None'
xff = request.headers.get('X-Forwarded-For', 'EMPTY')
print(f"[DEBUG IP] peer={peer}, trusted={peer in TRUSTED_PROXY_IPS}, count={TRUSTED_PROXY_COUNT}, xff={xff}",
flush=True)
# === 临时调试 ===
if TRUSTED_PROXY_COUNT > 0 and _peer_is_trusted_proxy(request):
forwarded = request.headers.get('X-Forwarded-For', '')
if forwarded:
@@ -102,8 +108,13 @@ def _peer_is_trusted_proxy(request) -> bool:
若 TRUSTED_PROXY_IPS 为空或对端不命中 → 不信任代理头。否则应用被直接暴露
(如 Docker bridge 映射端口、未走 Nginx)时,客户端可随意伪造 XFF 首部,
绕过基于 IP 的登录锁定/请求限流。
特殊值: TRUSTED_PROXY_IPS 包含 '0.0.0.0' 时信任所有对端(适用于 CDN 等
动态边缘IP场景,安全由 CDN + nginx 保证)。
"""
if not TRUSTED_PROXY_IPS:
return False
if '0.0.0.0' in TRUSTED_PROXY_IPS:
return True
client = request.client
return client is not None and client.host in TRUSTED_PROXY_IPS