/**
* 获取客户端IP地址
* <br />来源:ThinkPHP
* <br />"X-FORWARDED-FOR" 是代理服务器通过 HTTP Headers 提供的客户端IP。代理服务器可以伪造任何IP。
* <br />要防止伪造,不要读这个IP即可(同时告诉用户不要用HTTP 代理)。
* @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
* @param boolean $adv 是否进行高级模式获取(有可能被伪装)
* @return mixed
*/
function getIp($type = 0, $adv = true){
$type = $type ? 1 : 0;
static $ip = null;
if (null !== $ip) {
return $ip[$type];
}
$httpAgentIp = $this->config['http_agent_ip'];
if ($httpAgentIp && $this->server($httpAgentIp)) {
$ip = $this->server($httpAgentIp);
} elseif ($adv) {
if ($this->server('HTTP_X_FORWARDED_FOR')) {
$arr = explode(',', $this->server('HTTP_X_FORWARDED_FOR'));
$pos = array_search('unknown', $arr);
if (false !== $pos) {
unset($arr[$pos]);
}
$ip = trim(current($arr));
} elseif ($this->server('HTTP_CLIENT_IP')) {
$ip = $this->server('HTTP_CLIENT_IP');
} elseif ($this->server('REMOTE_ADDR')) {
$ip = $this->server('REMOTE_ADDR');
}
} elseif ($this->server('REMOTE_ADDR')) {
$ip = $this->server('REMOTE_ADDR');
}
// IP地址类型
$ip_mode = (strpos($ip, ':') === false) ? 'ipv4' : 'ipv6';
// IP地址合法验证
if (filter_var($ip, FILTER_VALIDATE_IP) !== $ip) {
$ip = ('ipv4' === $ip_mode) ? '0.0.0.0' : '::';
}
// 如果是ipv4地址,则直接使用ip2long返回int类型ip;如果是ipv6地址,暂时不支持,直接返回0
$long_ip = ('ipv4' === $ip_mode) ? sprintf("%u", ip2long($ip)) : 0;
$ip = [$ip, $long_ip];
return $ip[$type];
}
/**
* 获得用户的真实IP地址
* <br />来源:ecshop
* <br />$_SERVER和getenv的区别,getenv不支持IIS的isapi方式运行的php
* @access public
* @return string
*/
function real_ip() {
static $realip = NULL;
if ($realip !== NULL) {
return $realip;
}
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
/* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
foreach ($arr AS $ip) {
$ip = trim($ip);
if ($ip != 'unknown') {
$realip = $ip;
break;
}
}
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
if (isset($_SERVER['REMOTE_ADDR'])) {
$realip = $_SERVER['REMOTE_ADDR'];
} else {
$realip = '0.0.0.0';
}
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$realip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_CLIENT_IP')) {
$realip = getenv('HTTP_CLIENT_IP');
} else {
$realip = getenv('REMOTE_ADDR');
}
}
// 使用正则验证IP地址的有效性,防止伪造IP地址进行SQL注入攻击
preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
return $realip;
}
转载于:https://my.oschina.net/qqlet/blog/2999781