PHP 中檢查或過濾IP地址的實現(xiàn)代碼
更新時間:2011年11月27日 22:40:02 作者:
網(wǎng)絡環(huán)境異常復雜,有時候我們不得不禁止一些惡意用戶訪問,禁止的方式有很多種,其中一種就是通過 IP 來限制,本文提供的方法允許你通過 IP 區(qū)間、CIDR (Classless Inter-Domain Routing)及單個 IP 格式來檢查或過濾 IP 地址
你可以通過增加一個配置文件,然后將需要禁止的一些 IP 地址通過一定規(guī)則添加到配置文件中,在程序初始化的時候,讀取配置文件中的每個規(guī)則,然后通過本文提供的方法去檢查當前訪問的客戶端 IP 地址是否存在于這些規(guī)則中,如果存在,則拒絕提供服務。
<?php
/**
* PHP 中檢查或過濾 IP 地址
*
* 支持 IP 區(qū)間、CIDR(Classless Inter-Domain Routing)及單個 IP 格式
* 整理:http://www.CodeBit.cn
* 參考:
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#70055}
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#82397}
*
* @param string $network 網(wǎng)段,支持 IP 區(qū)間、CIDR及單個 IP 格式
* @param string $ip 要檢查的 IP 地址
* @return boolean
*/
function netMatch($network, $ip) {
$network = trim($network);
$ip = trim($ip);
$result = false;
// IP range : 174.129.0.0 - 174.129.255.255
if (false !== ($pos = strpos($network, "-"))) {
$from = ip2long(trim(substr($network, 0, $pos)));
$to = ip2long(trim(substr($network, $pos+1)));
$ip = ip2long($ip);
$result = ($ip >= $from and $ip <= $to);
// CIDR : 174.129.0.0/16
} else if (false !== strpos($network,"/")) {
list ($net, $mask) = explode ('/', $network);
$result = (ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($net);
// single IP
} else {
$result = $network === $ip;
}
return $result;
}
// 174.129.0.0 - 174.129.255.255
var_dump(netMatch(' 174.129.0.0 - 174.129.255.255 ', '174.129.1.31')); // True
var_dump(netMatch(' 174.129.0.0/16 ', '174.139.1.31')); // False
var_dump(netMatch(' 174.129.1.32 ', '174.129.1.31')); // False
?>
由于中國使用的大多數(shù)都是動態(tài) IP 地址,所以通過 IP 地址限制訪問具有一定的局限性,使用的時候需要謹慎,但是對于應急限制訪問來說,還是非常有用的。
復制代碼 代碼如下:
<?php
/**
* PHP 中檢查或過濾 IP 地址
*
* 支持 IP 區(qū)間、CIDR(Classless Inter-Domain Routing)及單個 IP 格式
* 整理:http://www.CodeBit.cn
* 參考:
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#70055}
* - {@link http://us2.php.net/manual/zh/function.ip2long.php#82397}
*
* @param string $network 網(wǎng)段,支持 IP 區(qū)間、CIDR及單個 IP 格式
* @param string $ip 要檢查的 IP 地址
* @return boolean
*/
function netMatch($network, $ip) {
$network = trim($network);
$ip = trim($ip);
$result = false;
// IP range : 174.129.0.0 - 174.129.255.255
if (false !== ($pos = strpos($network, "-"))) {
$from = ip2long(trim(substr($network, 0, $pos)));
$to = ip2long(trim(substr($network, $pos+1)));
$ip = ip2long($ip);
$result = ($ip >= $from and $ip <= $to);
// CIDR : 174.129.0.0/16
} else if (false !== strpos($network,"/")) {
list ($net, $mask) = explode ('/', $network);
$result = (ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($net);
// single IP
} else {
$result = $network === $ip;
}
return $result;
}
// 174.129.0.0 - 174.129.255.255
var_dump(netMatch(' 174.129.0.0 - 174.129.255.255 ', '174.129.1.31')); // True
var_dump(netMatch(' 174.129.0.0/16 ', '174.139.1.31')); // False
var_dump(netMatch(' 174.129.1.32 ', '174.129.1.31')); // False
?>
由于中國使用的大多數(shù)都是動態(tài) IP 地址,所以通過 IP 地址限制訪問具有一定的局限性,使用的時候需要謹慎,但是對于應急限制訪問來說,還是非常有用的。
相關(guān)文章
PHP錯誤WARNING: SESSION_START() [FUNCTION.SESSION-START]解決方法
這篇文章主要介紹了PHP錯誤WARNING: SESSION_START() [FUNCTION.SESSION-START]解決方法,需要的朋友可以參考下2014-05-05
javascript+php實現(xiàn)根據(jù)用戶時區(qū)顯示當?shù)貢r間的方法
這篇文章主要介紹了javascript+php實現(xiàn)根據(jù)用戶時區(qū)顯示當?shù)貢r間的方法,實例分析javascript獲取客戶端時區(qū)及與服務器端php交互的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
php操作redis數(shù)據(jù)庫常見方法實例總結(jié)
這篇文章主要介紹了php操作redis數(shù)據(jù)庫常見方法,結(jié)合實例形式總結(jié)分析了PHP操作redis數(shù)據(jù)庫的基本安裝、連接、字符串、哈希表、列表、集合等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
PHP實現(xiàn)提取多維數(shù)組指定一列的方法總結(jié)
這篇文章主要介紹了PHP實現(xiàn)提取多維數(shù)組指定一列的方法,結(jié)合實例形式總結(jié)分析了PHP針對多維數(shù)組的遍歷、轉(zhuǎn)換、提取等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12

