在真实环境下,php获取客户端ip地址的方法通常有以下几种:

(1):通过$_SERVER[ "HTTP_CLIENT_IP" ]

(2):通过$_SERVER[ "HTTP_X_FORWARDED_FOR" ]

(3):通过$_SERVER[ "REMOTE_ADDR" ]

这里需要注意的是:在php中的$_SERVER数组中以HTTP开头的值,都是由客户端(client)传递到服务端的,也就是说这一部分是可以进行伪造的。而$_SERVER[ "REMOTE_ADDR" ]是由服务器传递的,是不能进行伪造的(如果这一部分都可以伪造,那就服务器没有办法传递数据到正确的客户端上了)

php通过curl函数进行HTTP_CLIENT_IP以及HTTP_X_FORWARDED_FOR进行伪造:

curl_setopt( $ch , CURLOPT_HTTPHEADER , array('X-FORWARDED-FOR:'.$ip, 'CLIENT-IP:'.$ips ) );

其中的 $_SERVER[ "HTTP_X_FORWARDED_FOR" ] 一开始我压根不知道这是什么,后来查了一下,总结一下:X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。它的基本格式如下:X-Forwarded-For: client, proxy1, proxy2 (存在反向代理以及负载均衡时会用到,这个也是可以伪造的)

在不存在反向代理或负载均衡的情况下,服务端通过$_SERVER[ "REMOTE_ADDR" ]就可以获取真实的客户端ip地址

在存在反向代理或负载均衡的情况下,服务端通过$_SERVER[ "REMOTE_ADDR" ]获取到的并不是客户端的ip地址,而是反向代理服务器或者分发服务器的ip地址(详情看下图)

服务端获取的remote_addr其实是由传递数据到php解析器的服务器传递的,传递时连接服务器的ip地址,上图http文件服务器所获取的remote_addr就是nginx服务器的ip地址

如何在存在反向代理以及负载均衡的情况下获取客户端的真实的ip地址那?解决办法如下:

在上图的nginx服务器(代理服务器中)进行HTTP_X_FORWARD_FOR参数的配置,配置如下:

location ~ "\.+\.php$" {

fastcgi_pass localhost:9000;

fastcgi_param  HTTP_X_FORWARD_FOR  $remote_addr;

} -----nginx向php-fpm传递的HTTP_X_FORWARD_FOR参数是nginx获取的真实的客户端ip,那么在php脚本中直接获取$_SERVER[ "HTTP_X_FORWARD_FOR" ]就可以获取真实的客户端ip地址了

最新文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
  2. 每天记一些php函数,jQuery函数和linux命令(三)
  3. 使用.NET FrameWork获取CPU,内存使用率以及磁盘空间
  4. WPF中的VisualTreeHelper
  5. Keep two divs sync scroll and example
  6. 【HDOJ】4775 Infinite Go
  7. (转载)Flash Builder和flashdevelop 常用快捷键
  8. [Javascript] Log Levels and Semantic Methods
  9. PHP 时间和日期 总结
  10. 姿势体系结构的详细解释 -- C
  11. CoffeeScript NgComponent
  12. 驱动7段LED显示器
  13. 新手站长选择WordPress程序建站需要注意的8个问题
  14. TypeScript设计模式之门面、适配器
  15. Appium python自动化测试系列之自动化截图(十一)
  16. 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例
  17. 基于Django框架对MongoDB实现增删改查
  18. [LeetCode&Python] Problem 504. Base 7
  19. nginx报502 bad GateWay错误的解决方法
  20. sencha touch 在线实战培训 第一期 第一节

热门文章

  1. Java中的集合详解及代码测试
  2. Sprak2.0 Streaming消费Kafka数据实时计算及运算结果保存数据库代码示例
  3. VS 2019编辑含有资源文件.resx的项目时提示MSB3086 任务未能使用 SdkToolsPath 或注册表项找到“al.exe”
  4. Uboot命令U_BOOT_CMD分析
  5. python数据分析第二版:数据加载,存储和格式
  6. B2C自营商城的订单设计方案
  7. wine安装与配置
  8. 英语单词composing
  9. OC + RAC (二) Command 命令的用法
  10. (转)cat > file << EOF 的用法