PHP获取ip地址
2016-06-16 00:00
429 查看
摘要: 一般的PHP获取ip地址的函数中,都会利用REMOTE_ADDR和HTTP_X_FORWARDED_FOR来获取。
1.’REMOTE_ADDR’ 是远端IP,默认来自tcp 连接是,客户端的Ip。也就是直接连服务器的客户端IP。如果对方通过代理服务器上网,获取到的是代理服务器的IP了。例如:c->proxy->s;
如果我们使用了nginx之类的反向代理服务器,我们获取的就是nginx代理服务器的ip。例如:c->nginx->s
2.’HTTP_X_FORWARDED_FOR’的格式:HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 为了能在复杂的网络中获取到最接近用户的IP(有可能是代理IP地址)。在通过了HTTP 代理或者负载均衡服务器时会添加该项,通过一次,就会加上一个的ip。当然用户可以伪造该项的第一个;
例如 u(192.168.1.1)->proxy1(192.168.1.2)->proxy2(192.168.1.3)->nginx(192.168.1.5)->s ,则X-Forwarded-For: 192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4
但是后面的ip是代理服务器或者nginx反向代理服务器加上的ip,后面的ip是伪造不了的;
获取的HTTP_X_FORWARDED_FOR 前面的地址都有可能是用户伪造的,最后一个是伪造不了的。所以我们可以从后面往前取第一个不在我们ip数组中的地址。
1.’REMOTE_ADDR’ 是远端IP,默认来自tcp 连接是,客户端的Ip。也就是直接连服务器的客户端IP。如果对方通过代理服务器上网,获取到的是代理服务器的IP了。例如:c->proxy->s;
如果我们使用了nginx之类的反向代理服务器,我们获取的就是nginx代理服务器的ip。例如:c->nginx->s
2.’HTTP_X_FORWARDED_FOR’的格式:HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 为了能在复杂的网络中获取到最接近用户的IP(有可能是代理IP地址)。在通过了HTTP 代理或者负载均衡服务器时会添加该项,通过一次,就会加上一个的ip。当然用户可以伪造该项的第一个;
例如 u(192.168.1.1)->proxy1(192.168.1.2)->proxy2(192.168.1.3)->nginx(192.168.1.5)->s ,则X-Forwarded-For: 192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4
但是后面的ip是代理服务器或者nginx反向代理服务器加上的ip,后面的ip是伪造不了的;
获取的HTTP_X_FORWARDED_FOR 前面的地址都有可能是用户伪造的,最后一个是伪造不了的。所以我们可以从后面往前取第一个不在我们ip数组中的地址。
/** * 获取用户IP * @param type $allowProxys(我们负载均衡服务器ip) * @return string */ function get_client_ip($allowProxys = array()) { if (getenv('REMOTE_ADDR')) { $onlineip = getenv('REMOTE_ADDR'); } else { $onlineip = $_SERVER['REMOTE_ADDR']; } if (in_array($onlineip, $allowProxys)) { if (getenv('HTTP_X_FORWARDED_FOR')) { $ips = getenv('HTTP_X_FORWARDED_FOR'); } else if ($_SERVER['HTTP_X_FORWARDED_FOR']) { $ips = $_SERVER['HTTP_X_FORWARDED_FOR']; } if ($ips) { $ips = explode(",", $ips); $count = count($ips); for($i = $count-1 ;$i < $count; $i--) { if (in_array($ips[$i], $allowProxys)) { array_pop($ips); } else { break; } } $curIP = array_pop($ips); $onlineip = trim($curIP); } } if (filter_var($onlineip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return $onlineip; } else { return '0.0.0.0'; } }
相关文章推荐
- 上传图片到远程服务器并返回图片地址到本地显示
- php对象和数组相互转换的方法
- 字符串中空格和换行的替换
- laravel5入门(三)
- PHP运行过程uml时序图
- 深入剖析php执行原理(4):函数的调用
- laravel elixir
- 简易php博客(6)_后台修改
- 简易php博客(5)_后台添加
- php 七种数据类型介绍
- 简易php博客(4)_后台显示列表
- 简易php博客(3)_后台登陆
- PHP 判断值为整数
- 简易php博客(2)_前台
- PHPwamp开发环境搭建详解
- Thinkphp 控制器
- 简易php博客(1)_安装
- Thinkphp框架基础
- PHP两种redirect
- 深入理解php-fpm.conf中的max_children和request_terminate_timeout