论X-Forwarded-For伪装代理请求与获取真实ip(springboot项目)
以下项目均是基于springboot2.x构建
1、使用X-Forwarded-For 伪装代理
之前做了一个项目,关于xxx抢购,当时是用spring boot做的,主要功能就是实现模拟真实用户登录、抢购等一整套自动化流程。
刚开始可以多任务执行,后面可能是被发现了,导致从服务器发出的抢购请求被限制(因为同一个出口ip),后来为了解决这个问题,找到了X-Forwarded-For 这个 配置, 即在请求头里增加一条X-Forwarded-For记录,该值为一个ip地址,通过伪造请求头,服务端再接收到这个请求后,就会解析X-Forwarded-For里面的值,获取到ip地址,因为我写了一个动态随机生成ip的方法,所以每次获取的ip都不一样,这样就可以欺骗服务器,让它认为是不通客户端的请求。
2、如何防御X-Forwarded-For伪造ip
后面的话,又做了一个项目,这个项目与上一个项目恰恰相反---它是需要获取客户端的真实请求ip的(用于防止伪装请求),因为上一个项目让我知道这个ip是可以伪造的,所以我在网上查了一查如何获取真实IP的方法,以下代码为网上搜素:
/*** 获取请求的ip* @param request* @return*/public static String getIpAddr(HttpServletRequest request) {String ipAddress = null;try {ipAddress = request.getHeader("x-forwarded-for");if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("Proxy-Client-IP");}if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("WL-Proxy-Client-IP");}if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getRemoteAddr();if (ipAddress.equals("127.0.0.1")) {// 根据网卡取本机配置的IPtry {ipAddress = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}}}// 通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割if (ipAddress != null) {if (ipAddress.contains(",")) {return ipAddress.split(",")[0];} else {return ipAddress;}} else {return "";}} catch (Exception e) {e.printStackTrace();return "";}}
那么其实上面一段代码,正常没有经过nginx反向代理服务器的话, 如果客户端通过 X-Forwarded-For 伪造ip,那么基本上就是没有用的了,因为在一开始 ipAddress = request.getHeader("x-forwarded-for"); 这里获取到的ip已经是伪造过的ip了
那么如何识别客户端的真实ip呢,这里面有两个处理方式:
1)无代理
如果只是普通的web项目的话,通过 String ip = request.getRemoteAddr(); (HttpServletRequest 类型) 即可获取到客户端的真实ip
2)Nginx代理
在有代理的情况下,由于任何请求首先经过Nginx,故通过request.getRemoteAddr()获取的其实是Nginx的IP,并非真实的客户端IP;此时通过x-forwarded-for获取的IP为:"客户端,代理1,代理2,..."或者"伪造IP,客户端,代理1,代理2,...",故不能获取到准确的客户端IP,此时需要配置Nginx TCP客户端连接的真实IP,通过代理配置获取真实IP,可以通过$remote_addr获取客户端IP,Nginx配置如下:
location / {//追加如下代码proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
然后服务端通过: String ip = request.getHeader("X-Real-IP"); 即可获取到客户端的真实ip
论X-Forwarded-For伪装代理请求与获取真实ip(springboot项目)相关推荐
- nginx代理后,获取真实IP,做并发访问限制的方法(限流)
站点在运行时,为了防止DDoS 攻击.或内部接口调用造成的数据迸发,nginx提供了limit限流模块: HttpLimitZoneModule 限制同时并发访问的数量HttpLimitReqModu ...
- nginx在CDN加速或使用SLB代理后,获取真实IP,做并发访问限制的方法
https://blog.csdn.net/zzy5066/article/details/81137017
- HAProxy代理后端服务取真实IP
HAProxy代理后端服务取真实IP 两台局域网内的webpy服务A.B,一台HAProxy用来做代理P,配有域名p.com 前期的请求从p.com访问没有问题,但有一个请求是需要记录客户端的IP,并 ...
- PHP、Tomcat获取Nginx代理后的客户端真实IP
PHP.Tomcat获取Nginx代理后的客户端真实IP 文章目录 PHP.Tomcat获取Nginx代理后的客户端真实IP 一.PHP获取Nginx代理后客户端真实IP Nginx配置 PHP配置 ...
- 使用nginx代理,怎么获取真实的IP
1.在nginx.conf配置中加入配置信息 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; pr ...
- 查找“CDN、负载均衡、反向代理”等大型网络真实IP地址的方法
查找"CDN.负载均衡.反向代理"等大型网络真实IP地址的方法 首先,CDN.负载均衡.反向代理还分为很多层,有时查出来的是最外层的 CDN 服务器群,真实的机器是不对外开 ...
- 从HTTP请求中获取客户IP地址
/*** 从HTTP请求中获取客户IP地址** @param request http请求* @return 客户IP地址*/public static String getIPAddress( Ht ...
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- java 获取请求客户端的真实IP地址
转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...
最新文章
- 1049 Counting Ones
- 边缘检测、霍夫变换、重映射、仿射变换、直方图均衡化
- 【转】iOS开发-Protocol协议及委托代理(Delegate)传值
- 中国最后一个原始部落-农业大健康·万祥军:历史千年传承
- C语言开发笔记(一)自动转换和强制转换
- leetcode 77. 组合 思考分析
- 纯干货 | UI界面中按钮设计汉堡按钮\菜单
- iOS 图片拉伸、拉伸两端保留中间
- Hive 架构知识体系及语法详解
- android文件操作和SDCard卡操作
- java连接数据库增删改查公共方法
- android 电话管理
- 连接不上sqlserver数据库解决办法
- 计算机组成原理 清华大学教学大纲,计算机组成原理-教学大纲.doc
- 【开发问题】Android——Fragment must be a public static class to be properly recreated from instanc
- 真的不建议学Python,煞笔才学习Python,学Python难?两个小时足够搞定
- find 查找文件或文件夹命令find
- 基于矩阵分解的协同过滤算法
- 吉首大学第八届“新星杯”大学生程序设计大赛(暨新生网络同步赛)
- 基于Socket编程实现FTP客户端
热门文章
- 天气转凉,一切开始起了变化
- 交叉编译busybox
- python链表的实现
- 【廖雪峰 python教程 课后题改编】利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
- Java中nextInt()和nextLine()混用问题解决
- oracle ping 超时_tnsping无法ping通的问题,TNS12535 TNS操作超时 (服务器环境:window server 2008R2 数据库环境:oracle 11 g)...
- IA32计算机系统,计算机CPU之CISC、RISC、x86、IA32、x86-64、IA64、ARM
- 2007-03-02 日志 TMD,这世道! 1
- Linux绿色版Nginx
- 最容易被老板炒掉的十类人