LEN

X-Forwarded-For IP伪造问题处理
这个文章放在云笔记里面半年多了, 出现问题场景是我们从 aws 迁移至 阿里云 之后;优化 api服务 发现有大量...
扫描右侧二维码阅读全文
01
2019/08

X-Forwarded-For IP伪造问题处理

这个文章放在云笔记里面半年多了, 出现问题场景是我们从 aws 迁移至 阿里云 之后;
优化 api服务 发现有大量用户通过 X-Forwarded-For 仿造客户端IP 从而跨过我们后端对IP做的频率限制.

原理很简单 一般公司服务器都是 在服务最前端放 slb/lvs 这种负载均衡服务, 用户请求的IP 插入 X-Forwarded-For 前面

我们使用加速通道 多层的代理 ;

后端按照如下顺序获取客户端的真实IP

HTTP_ALI_CDN_REAL_IP;
HTTP_CF_CONNECTING_IP;
HTTP_X_CONNECTING_IP;
XXXX_Client_IP;
USER_REAL_IP; (通过nodejs 将用户的真实ip 透传给用户中心内网)

上述变量详解
HTTP_ALI_CDN_REAL_IP
链路配置了阿里云CDN,则阿里云CDN会传递此变量给后端,变量内的值就是客户端的真实IP地址。
HTTP_CF_CONNECTING_IP
如上,该值是cloudflare提供的客户端真实IP地址。
HTTP_X_CONNECTING_IP
如上,该值是加速乐提供的客户端真实IP地址。
XXXX_Client_IP
该值适用场景是SLB-->Nginx直连情况下,Nginx层启用了递归搜索。并且需要OP手动添加上层SLB的IP段为信任IP,通过判断X-Forwarded-For内最右侧的一个非信任IP值认定为客户端的真实IP地址并把此IP赋值给remote_addr,再由remote_addr赋值给XXXX_Client_IP。后端配置该配置前,请先跟OP确认上层是否配置。

XXXX_Client_IP 后端的应用服务(proxy_pass)赋值变量:

    location / {
        ... ...
        proxy_set_header XXXX_Client_IP $remote_addr;
        ... ...
    }

转发到后端的FastCGI服务(fastcgi_param)赋值变量:

    location ~ \.php$ {
        ... ...
        fastcgi_param   XXXX_Client_IP  $remote_addr;
        ... ...
    }

下面是客户端代理的IP 捕获文章 与 上文没有关系 ...

参考地址: https://www.cnblogs.com/rendd/p/6183094.html

1、没有代理服务器
  
HTTP_X_FORWARDED_FOR = 没数值或不显示 (X-Forwarded-For)
REMOTE_ADDR = 客户端IP

    $ip = $_SERVER['REMOTE_ADDR'];

2、透明代理

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)

这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip
 

    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

三、使用普通匿名代理服务器,

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)

  这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

四、使用欺骗性代理服务器,

  REMOTE_ADDR = 代理服务器 IP
  HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)

  服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。

五、使用高匿名代理,

  REMOTE_ADDR = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 没数值或不显示

  使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"]$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。


上面 五类IP获取方式 总结下 前2种都是可以真实获取客户端IP 后面 3种方式 基本服务端是抓瞎的. 主要介绍的是纯客户端的捕捉ip 方式

最后修改:2019 年 08 月 01 日 12 : 50 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论