- 首页 > it技术 > >
- php的ip信息来源是在 $_SERVER(超全局变量中):
'HTTP_X_FORWARDED_FOR' 、'HTTP_CLIENT_IP' 、'REMOTE_ADDR'
- REMOTE_ADDR:获取客户端ip地址;(如果客户端使用代理服务器,获取最后一个代理服务器ip地址)(该ip是不容易伪造的)
- HTTP_CLIENT_IP:代理服务器发送的HTTP头。(可能被修改)
- HTTP_X_FORWARDED_FOR:代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。(容易被修改)
- HTTP_X_FORWARDED_FOR 和 HTTP_CLIENT_IP:都是通过HTTP头的形式的获取ip信息,就很可能被用户进行修改。
- REMOTE_ADDR:是及时生成的,不容易被修改。
文章图片
客户端ip
文章图片
客户端ip
文章图片
获取ip注意
文章图片
ip限制注意
我们需要考虑的是:代理服务的可能是正常访问的用户;也可能是恶意修改ip地址破坏的用户。
/**
* 获取客户端IP地址
* @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
* @return mixed
*/
function get_client_ip($type = 0) {
//> 相当于intval函数,对用户输入进行一次过滤
$type=$type ? 1 : 0;
//> 参数设计0 | 1为后面返回ip准备
//> 采用静态变量,保存本次HTTP请求不再去获取相同的ip
static $ip=NULL;
if ($ip !== NULL) return $ip[$type];
//> 判断用户是否通过代理服务器访问(用户可能伪造ip地址)
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
//> 正确的代理是通过逗号分隔的字符串 explode分隔字符串成数组
$arr=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
//> 搜索'unknown'是否在$arr中(值搜索),如果存在返回对应的键;否则返回false(unknown可能是一些系统原因造成的)
$pos=array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
//> 去除字符串开始和结尾的空格或其他。
$ip=trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip=$_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
$long = sprintf("%u",ip2long($ip));
//> sprintf():格式化指定的变量
$ip= $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
//>------------------------------------ 函数详解 --------------------------------------
//> explode :使用分隔符分隔字符串,返回数组
//> 分隔限制数量:正数 则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。
//> 负数:则返回除了最后的 -limit 个元素外的所有元素。
//> 0:当做 1 处理
array explode( '分隔符', '分隔字符串' [, '分隔限制数量'] );
> ------------------------------------------------------------------------------------------------
//> 在数组中搜索给定的值,如果成功则返回相应的键名;
否则返回 false(array_search函数定义)
mixed array_search(mixed $needle, array $haystack [, bool $strict = false])
>> $neddle //> 需要搜索的值
>> $haystack //> 在当前数组中搜索
>> $strict //> 是否采用严格搜索;默认 false (不比较数据类型)。
- trim() 、 ltrim() 、rtrim():去掉指定的字符
trim( $str [, $exp] ):去掉首位相应的$exp字符,返回处理后的字符串(如果没有$exp,采用默认值;参看手册)
ltrim( $str [, $exp] ):去掉开始相应的字符。用法和trim一模一样。
rtrim( $str [, $exp] ):去掉尾部相应的字符。用法和trim一模一样。
【PHP获取ip信息】关于如何伪造ip,百度
推荐阅读