# -*- coding: utf-8 -*- """客户端 IP 解析工具(框架无关)。 从 auth_system 抽出:可信反代判定与 XFF/X-Real-IP 解析规则。 调用方(web.ratelimit / web.deps)从请求头取值后传入, 故此处只保留纯函数(不依赖任何 Web 框架)。 """ def is_loopback_ip(ip: str) -> bool: """可信反代判定(从"所有内网源"收窄为仅回环地址)。 服务绑 0.0.0.0 时内网任意主机都可直连伪造 XFF/X-Real-IP 轮换绕过限流与 登录锁定(实测实锤);同机 Caddy 反代(127.0.0.1 → 本服务)不受影响。""" try: import ipaddress addr = ipaddress.ip_address(ip) return addr.is_loopback except ValueError: return False def trusted_proxy_ip(header_value: str) -> str: """从可信反代转发的 X-Forwarded-For 中取最右一个可解析 IP。 最右段是可信反代(Caddy)追加的直连方地址;最左段与 X-Real-IP 均可被客户端 伪造(Caddy 默认不改写客户端自带的 X-Real-IP),采信它们等于给限流/锁定/省份 记录开了伪造口。无有效值返回空串,调用方回落 remote_addr。""" if not header_value: return '' import ipaddress as _ipa for part in reversed(header_value.split(',')): part = part.strip() if not part: continue try: return str(_ipa.ip_address(part)) except ValueError: continue return '' # 兼容原名(auth_system 等历史调用点沿用下划线命名) _is_loopback_ip = is_loopback_ip _trusted_proxy_ip = trusted_proxy_ip