## 判斷是否為合法的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;
}
~~~