## 判断是否为合法的ip地址(is_ip_address)
~~~
/**
* 判断是否为合法的ip地址
* @param string $ip ip地址
* @return bool|int 不合法则返回false,合法则返回4(IPV4)或6(IPV6)
*/
function is_ip_address($ip)
{
$ipv4Regex = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/';
$ipv6Regex = '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i';
if (preg_match($ipv4Regex, $ip))
return 4;
if (false !== strpos($ip, ':') && preg_match($ipv6Regex, trim($ip, ' []')))
return 6;
return false;
}
~~~
## 获取客户端IP地址(get_ip_address)
~~~
/**
* 获取客户端访问ip地址
* @return string ip地址
* 说明:
* $_SERVER超级全局变量中的 HTTP_X_FORWARDED_FOR可以通过curl或fsockopen等的函数进行构(伪)造头信息,如果在一些需要验证ip地址的场景(比如判断ip登录地址,通过ip统计抽奖次数等),会有被欺骗的风险。
* 其实$_SERVER超级全局变量中以 HTTP_开头的元素,都可以被构(伪)造,业务中以此进行验证或判断的逻辑,都需要谨慎。
*
*/
function get_ip($default=''){
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : $default;
}
~~~