针对如何获取请求方的IP地址,我们在这里简单的做一个分析:获取ip的函数方法有多种多样,但是基于的原理基本都是根据TCP/IP协议,http也是一样。ip被包含在tcp/ip的数据包中,通过相应的函数可以获取这个ip数据。如下图所以。
原文地址:侯哥小博http://37blog.com/?p=67
下面解析一下,不同的函数获取ip的区别和联系:
1、getenv()函数方法:getenv()函数获取环境变量的值。(注意这个函数不支持IIS下的php)
HTTP_CLIENT_IP 是代理服务器发送的HTTP头,HTTP_CLIENT_IP确实存在于http请求的header里。如果是“超级匿名代理”,则返回none值。
getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。
{
$IP = '';
if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$IP = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$IP = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$IP = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$IP = $_SERVER['REMOTE_ADDR'];
}
return $IP ? $IP : "unknow";
}
$_SERVER["REMOTE_ADDR"]可以获取正在浏览网页的客户端ip地址,理论上可以通过伪造http头信息来更改ip地址,但实际中是否容易伪造,未有尝试。
一下方法可以比较安全的获取ip
$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
echo $user_IP