获取真实IP的几种方式
来源:互联网 发布:淘宝评价时间是多久 编辑:程序博客网 时间:2024/05/22 17:21
一些基础知识的补充
根据不同的访问情况,PHP提供几个不同的环境变量用于获取客户端IP:
- REMOTE_ADDR
- HTTP_VIA
- HTTP_X_FORWARDED_FOR
它们的主要区别在于,用户在访问网站的时候是否使用了代理服务器,以及使用何种代理服务。
一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理服务器的情况:Transparent Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
——————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————
具体实现的代码
第一种方法
function get_real_ip(){ $ip=false; if(!empty($_SERVER['HTTP_CLIENT_IP'])){ $ip=$_SERVER['HTTP_CLIENT_IP']; }if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']); if($ip){ array_unshift($ips, $ip); $ip=FALSE; }for ($i=0; $i < count($ips); $i++){if(!eregi ('^(10│172.16│192.168).', $ips[$i])){$ip=$ips[$i];break;}}}return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); }
第二种方法
function get_real_ip(){ static $realip; if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $realip=$_SERVER['HTTP_X_FORWARDED_FOR']; }else if(isset($_SERVER['HTTP_CLIENT_IP'])){ $realip=$_SERVER['HTTP_CLIENT_IP']; }else{ $realip=$_SERVER['REMOTE_ADDR']; } }else{ if(getenv('HTTP_X_FORWARDED_FOR')){ $realip=getenv('HTTP_X_FORWARDED_FOR'); }else if(getenv('HTTP_CLIENT_IP')){ $realip=getenv('HTTP_CLIENT_IP'); }else{ $realip=getenv('REMOTE_ADDR'); } } return $realip;}
// 获取IP地址function getIp(){$ip='未知IP';if(!empty($_SERVER['HTTP_CLIENT_IP'])){return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip;}else{return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip;}}function is_ip($str){$ip=explode('.',$str);for($i=0;$i<count($ip);$i++){ if($ip[$i]>255){ return false; } } return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str); }
最后附上一个获取服务器IP地址
/*** 获取服务器端IP地址 * @return string */function get_server_ip() { if (isset($_SERVER)) { if($_SERVER['SERVER_ADDR']) { $server_ip = $_SERVER['SERVER_ADDR']; } else { $server_ip = $_SERVER['LOCAL_ADDR']; } } else { $server_ip = getenv('SERVER_ADDR'); } return $server_ip;
- 获取真实IP的几种方式
- 获取客户端IP的几种方式
- 通过IP获取地理位置信息的几种方式
- python获取公网ip的几种方式
- 获取本地IP几种方式
- 获取真实的IP地址
- 获取来访者的真实IP
- 获取真实的IP地址
- 获取客户端的真实ip
- 获取真实的客户IP
- 获取客户端真实的ip
- 获取用户的真实ip
- 获取客户端的真实ip
- Java获取客户端真实IP地址的两种方法
- Java获取客户端真实IP地址的两种方法
- Java获取客户端真实IP地址的两种方法
- Java获取客户端真实IP地址的两种方法
- Java获取客户端真实IP地址的两种方法
- phpstrom 字体样式的设置
- web前端之dojo实际应用及开发二:事件处理(附有源码)
- 方法的重写与super以及重写与重载的区别
- css选择器
- android 数据存储--SharedPreferences
- 获取真实IP的几种方式
- 项目管理利器(Maven)——Maven的生命周期
- 华为任正非强烈推荐的一篇爆文:以色列崛起之谜!
- laravel基于SMTP邮件实现
- C语言宏定义
- Java中Arrays类
- 对象导论,控制流程,操作符
- 每一个小孩都是种子,请允许Ta在成长的路上跌跌撞撞。耐心的等待,种子一定能长成参天大树!
- Mybatis Invalid bound statement (not found)问题分析