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 之前的所有代理信息都被抹掉,无法为真正使用代理的用户提供更好的服务

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

本文地址:https://chengxuzhixin.com/blog/article/300421.html

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

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