Java获取真实IP地址

2021-11-01 From 程序之心 By 丁仪

客户端经过代理机器访问,或者 Nginx 转发后,都会导致无法通过 request.getRemoteAddr() 获取真实 IP。

无法获取真实 IP 会导致对访问请求判断不准确,如判断用户异地登录风险、防止重复刷票等。

代理机器转发后,一般会在 x-forwarded-for 中记录来源 IP,如有多级代理可能会有多个。格式如下

X-Forwarded-For: client1, proxy1, proxy2

获取真实 IP 代码如下:

public String getClientIp(HttpServletRequest request) {
    String xff = request.getHeader("X-Forwarded-For");
    if (xff == null) {
        return request.getRemoteAddr();
    } else {
        return xff.contains(",") ? xff.split(",")[0] : xff;
    }
}

伪造 X-Forwarded-For

由于是从 header 中获取 IP,攻击者可以在请求中直接传 X-Forwarded-For 来伪造 IP。可以通过 Nginx 配置 $remote_addr 来强行覆盖伪造数据,格式如下

proxy_set_header X-Forwarded-For $remote_addr;

$remote_addr 是 TCP 连接的客户端 IP,是无法被伪造的。但是也导致请求到达 Nginx 之前的所有代理信息都被抹掉,无法为真正使用代理的用户提供更好的服务。

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《分布式算法精髓》
互联网是一个分布式系统,无线通信、云计算或并行计算、多核系统、移动网络也是如此。蚁群、大脑甚至人类社会都可以被建模为分布式系统。本书强调这些分布式系统中共同涉及的主题和技术,特别是强调分布式系统设计中的一些基本问题,涵盖通信、协调、容错性、本地性、并行性、打破对称性、同步化、不确定性等。
发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号