后端获取真实用户ip

背景

在进行jwt的ip验证时,之前采用的是request.getRemoteAddr();方式获取用户ip,本来是没有问题的(因为这种方式获取的ip是通过三次握手指定的,一定是真实的),可是使用nginx做反向代理后,获得的ip是nginx的本地ip,需要对这种方式做一下更改。

问题分析

  • 如何获取客户端的ip而不是代理服务器的ip
  • 如何确保获取的ip是真实ip,而不是用户自己制定的

一、获取客户端ip

X-Forwarded-For 是一个 HTTP 扩展头部。 请求头格式非常简单,就这样:

X-Forwarded-For: client, proxy1, proxy2

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。

Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。

对nginx进行配置

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://127.0.0.1:9009/;
    proxy_redirect off;
}

这时候,X-Forwarded-For头的第一个近视用户的真实ip

二、确保获取的ip是真实ip

这种方式有一个问题,就是客户可以携带这个字段,除了Remote Address,其他的都是不可信的,比如用户的请求是

curl www.suhongyan.xyz:6666/ -H 'X-Forwarded-For 1.1.1.1'

那么结果可能为

X-Forwarded-For: 1.1.1.1,IP0, IP1, IP2

所以需要在nginx上做一些处理

location / {
    set_real_ip_from 127.0.0.1;
    real_ip_header    X-Forwarded-For;
    real_ip_recursive on;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

java服务器接收方法为

    public static String getRealRemoteAddr(HttpServletRequest request){
        String addr;
        if ((addr = request.getHeader("x-real-ip")) != null){
            return addr;
        }

        // 测试阶段,没有配置x-real-ip时使用
        return request.getRemoteAddr();
    }

这种做法也就是排除X-Forwarded-For中出现的set_real_ip_from ip中的ip,也就是取出X-Forwarded-For从右开始的第一个不在配置中的ip,来忽略用户的自定义参数,从而到达效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文转载自https://www.cnblogs.com/hftian/p/11127152.html作者: hf...
    RainingMan阅读 1,575评论 0 15
  • 原创文章出自公众号:「码农富哥」,如需转载请请注明出处!文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!...
    大富帅阅读 154,561评论 5 28
  • 在很多 Web 应用场景下,我们会基于 IP 做访问控制或者访问频率限制,又或者根据 IP 获取访问用户的所在地。...
    猴子精h阅读 4,438评论 0 1
  • 今天与同事讨论关于车间是否带手机进入的问题。按照他的意见是禁止带进去,且马上执行,不过,按照我的想法是,如果要执行...
    oilyne阅读 215评论 1 2
  • 更远的第三人称的叙述练习: 老王昨晚八点接到一个活,让去把东区3号楼2门的门洞和楼梯刷个漆,修缮一下。物业说,看着...
    王琼输出的力量阅读 151评论 0 1

友情链接更多精彩内容