首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Http请求中获取请求的真实的IP地址

  • 25-02-16 18:21
  • 3517
  • 13446
blog.csdn.net

获取客户端IP

  • 一、标题网络上常见的请求头
    • 1、X-Forwarded-For
    • 2、Proxy-Client-IP
    • 3、WL- Proxy-Client-IP
    • 4、HTTP_CLIENT_IP
    • 5、X-Real-IP
  • 二、注意事项
    • 1、非标准请求头
    • 2、不一定存在
    • 3、多重代理顺序
    • 4、请求头伪造
  • 三、代码场景样例

一、标题网络上常见的请求头

1、X-Forwarded-For

X-Forwarded-For 是一个 HTTP 扩展头部。

HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入。

如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用。只有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项。

X-Forwarded-For 请求头格式非常简单:

X-Forwarded-For: client, proxy1, proxy2

一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。

2、Proxy-Client-IP

这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL- Proxy-Client-IP是他的

3、WL- Proxy-Client-IP

weblogic插件加上的请求头头

4、HTTP_CLIENT_IP

有些代理服务器会加上此请求头

5、X-Real-IP

nginx代理一般会加上此请求头

二、注意事项

1、非标准请求头

这些请求头都不是http协议里的标准请求头,也就是说这个是各个代理服务器自己规定的表示客户端地址的请求头。如果哪天有一个代理服务器软件用oooo-client-ip这个请求头代表客户端请求,那上面的代码就不行了。

2、不一定存在

这些请求头不是代理服务器一定会带上的,网络上的很多匿名代理就没有这些请求头,所以获取到的客户端ip不一定是真实的客户端ip。代理服务器一般都可以自定义请求头设置。

3、多重代理顺序

即使请求经过的代理都会按自己的规范附上代理请求头,上面的代码也不能确保获得的一定是客户端ip。不同的网络架构,判断请求头的顺序是不一样的。

4、请求头伪造

最重要的一点,请求头都是可以伪造的。
如果一些对客户端校验较严格的应用(比如投票)要获取客户端ip,
应该直接使用$remote_addr

ipAddresses = request.getRemoteAddr ();
  • 1

虽然获取到的可能是代理的ip而不是客户端的ip,
但这个获取到的ip是不可能伪造的
也就杜绝了刷票的可能。(有分析说arp欺骗+syn有可能伪造此ip,如果真的可以,这是所有基于TCP协议都存在的漏洞),这个ip是tcp连接里的ip。

三、代码场景样例

java中可以结合拦截器,获取每个请求的来源IP。(拦截器代码就不贴了)

public static String getIpAddress(HttpServletRequest request) {

        String sourceIp = null;

        String ipAddresses = request.getHeader("x-forwarded-for");

        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
            ipAddresses = request.getHeader("Proxy-Client-IP");
        }
        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
            ipAddresses = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
            ipAddresses = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
            ipAddresses = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
            ipAddresses = request.getRemoteAddr();
        }
        if (!StringUtils.isEmpty(ipAddresses)) {
            sourceIp = ipAddresses.split(",")[0];
        }

        return sourceIp;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
注:本文转载自blog.csdn.net的米尔柯的文章"https://blog.csdn.net/qq_33301866/article/details/108588521"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top