以下项目均是基于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项目)相关推荐

  1. nginx代理后,获取真实IP,做并发访问限制的方法(限流)

    站点在运行时,为了防止DDoS 攻击.或内部接口调用造成的数据迸发,nginx提供了limit限流模块: HttpLimitZoneModule 限制同时并发访问的数量HttpLimitReqModu ...

  2. nginx在CDN加速或使用SLB代理后,获取真实IP,做并发访问限制的方法

    https://blog.csdn.net/zzy5066/article/details/81137017

  3. HAProxy代理后端服务取真实IP

    HAProxy代理后端服务取真实IP 两台局域网内的webpy服务A.B,一台HAProxy用来做代理P,配有域名p.com 前期的请求从p.com访问没有问题,但有一个请求是需要记录客户端的IP,并 ...

  4. PHP、Tomcat获取Nginx代理后的客户端真实IP

    PHP.Tomcat获取Nginx代理后的客户端真实IP 文章目录 PHP.Tomcat获取Nginx代理后的客户端真实IP 一.PHP获取Nginx代理后客户端真实IP Nginx配置 PHP配置 ...

  5. 使用nginx代理,怎么获取真实的IP

    1.在nginx.conf配置中加入配置信息 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; pr ...

  6. 查找“CDN、负载均衡、反向代理”等大型网络真实IP地址的方法

    查找"CDN.负载均衡.反向代理"等大型网络真实IP地址的方法     首先,CDN.负载均衡.反向代理还分为很多层,有时查出来的是最外层的 CDN 服务器群,真实的机器是不对外开 ...

  7. 从HTTP请求中获取客户IP地址

    /*** 从HTTP请求中获取客户IP地址** @param request http请求* @return 客户IP地址*/public static String getIPAddress( Ht ...

  8. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  9. java 获取请求客户端的真实IP地址

    转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...

最新文章

  1. 1049 Counting Ones
  2. 边缘检测、霍夫变换、重映射、仿射变换、直方图均衡化
  3. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值
  4. 中国最后一个原始部落-农业大健康·万祥军:历史千年传承
  5. C语言开发笔记(一)自动转换和强制转换
  6. leetcode 77. 组合 思考分析
  7. 纯干货 | UI界面中按钮设计汉堡按钮\菜单
  8. iOS 图片拉伸、拉伸两端保留中间
  9. Hive 架构知识体系及语法详解
  10. android文件操作和SDCard卡操作
  11. java连接数据库增删改查公共方法
  12. android 电话管理
  13. 连接不上sqlserver数据库解决办法
  14. 计算机组成原理 清华大学教学大纲,计算机组成原理-教学大纲.doc
  15. 【开发问题】Android——Fragment must be a public static class to be properly recreated from instanc
  16. 真的不建议学Python,煞笔才学习Python,学Python难?两个小时足够搞定
  17. find 查找文件或文件夹命令find
  18. 基于矩阵分解的协同过滤算法
  19. 吉首大学第八届“新星杯”大学生程序设计大赛(暨新生网络同步赛)
  20. 基于Socket编程实现FTP客户端

热门文章

  1. 天气转凉,一切开始起了变化
  2. 交叉编译busybox
  3. python链表的实现
  4. 【廖雪峰 python教程 课后题改编】利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
  5. Java中nextInt()和nextLine()混用问题解决
  6. oracle ping 超时_tnsping无法ping通的问题,TNS12535 TNS操作超时 (服务器环境:window server 2008R2 数据库环境:oracle 11 g)...
  7. IA32计算机系统,计算机CPU之CISC、RISC、x86、IA32、x86-64、IA64、ARM
  8. 2007-03-02 日志 TMD,这世道! 1
  9. Linux绿色版Nginx
  10. 最容易被老板炒掉的十类人