如何在Django中检测VPN或代理用户并返回对应连接状态提示
问题根源
你当前的代码存在两个核心逻辑错误:
- 你编写的
check_ping函数是在Django服务端本地执行,检测的是服务器自身的网络连通性,和发起请求的用户是否使用VPN/代理没有任何关联 check_ping函数在模块加载阶段就已经执行完成,后续所有用户请求返回的都是第一次运行的固定结果,不会随用户变化动态判断
正确实现方案
判断用户是否使用代理/VPN,核心是检测用户发起的请求的特征,最常用的方案是检测HTTP请求头中代理相关的标记字段,示例代码如下:
from django.http import JsonResponse # 配置你自己的反向代理白名单,如果你用了Nginx等代理部署Django,把代理的IP加进来避免误判 TRUSTED_PROXY_IPS = {"127.0.0.1"} # 常见代理请求头列表 PROXY_HEADERS = { 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_VIA', 'HTTP_X_PROXY_ID', 'HTTP_FORWARDED', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_HOST', } def home(request): # 先排除自己的反向代理的情况 user_ip = request.META.get('REMOTE_ADDR', '') if user_ip in TRUSTED_PROXY_IPS: # 从X-Forwarded-For取真实用户IP,避免把自己的代理当成用户用的代理 xff = request.META.get('HTTP_X_FORWARDED_FOR', '') if xff: user_ip = xff.split(',')[0].strip() # 检测是否存在代理头 use_proxy = False for header in PROXY_HEADERS: if header in request.META: if user_ip not in TRUSTED_PROXY_IPS: use_proxy = True break if use_proxy: return JsonResponse({'status': "Network Error: Not Connected"}) else: return JsonResponse({'status': "Network Active: Connected"})
注意事项
- 该方案可以检测绝大多数透明代理、普通VPN,对于高匿代理、部分专用VPN的检测需要配合IP风险库实现,你可以将公开的VPN/代理IP段导入本地后新增IP校验逻辑即可
- 如果你没有用反向代理部署Django,可以删除白名单相关的逻辑,简化检测流程
内容的提问来源于stack exchange,提问作者Comfort Chambeshi
相关产品推荐
相关产品推荐

