学校的新闻系统要求有些新闻只开放校内ip浏览,于是重写了一个代码来实现此功能,实现后的结果是,只要把允许访问的ip列入ip.txt这个文件中即可,同时支持c类ip,例如:
ip.txt
192.168
211.67.188
211.67.191.25
代码如下:
/*<BR>* ip地址黑名单、白名单<BR>* 判断访客地址的ip是否在ip.txt中,支持c类ip<BR>* By xhat<BR>*/</P><P>$ip = $_SERVER['REMOTE_ADDR'];<BR>$ipArray = preg_replace("#rn?|n#","",file('ip.txt'));<BR>foreach ($ipArray as $ipTest) {<BR>if (substr_count($ip, $ipTest) != "0") {<BR>echo "ok"; //执行相关命令<BR>die();<BR>}<BR>}</P><P>?><BR>
上面大家可以使用代码来骗过了,下面代码进行升级
<?php <BR>class block_ip { <BR>var $Block_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*"); <BR>function __construct(){ <BR>} <BR>function __destruct(){ <BR>} <BR>private function makePregIP($str){ <BR>if (strstr($str,"-")) { <BR>$aIP = explode(".",$str); <BR>foreach ($aIP as $k=>$v) { <BR>if (!strstr($v,"-")) { <BR>$preg_limit .= makePregIP($v); <BR>} else{ <BR>$aipNum = explode("-",$v); <BR>for($i=$aipNum[0];$i<=$aipNum[1];$i++){ <BR>$preg .=$preg?"|".$i:"[".$i; <BR>} <BR>$preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":".".$preg."]"; <BR>} <BR>} <BR>}else{ <BR>$preg_limit .= $str."."; <BR>} <BR>return $preg_limit; <BR>} <BR>private function getAllBlockIP(){ <BR>if ($this->Block_ip) { <BR>foreach ($this->Block_ip as $k=>$v) { <BR>$ipaddres = $this->makePregIP($v->start_ip); <BR>$ip = str_ireplace(".",".",$ipaddres); <BR>$ip = str_replace("*","[0-9]{1,3}",$ip); <BR>$ipaddres = "/".$ip."/"; <BR>$ip_list[] = $ipaddres; <BR>} <BR>} <BR>return $ip_list; <BR>} <BR>public function checkIP() { <BR>$iptable = $this->getAllBlockIP(); <BR>$IsJoined = true; <BR>//取得用户ip <BR>$Ip = $this->get_client_ip(); <BR>$Ip = trim($Ip); <BR>//剔除黑名单中的IP区段 <BR>if ($iptable) { <BR>foreach($iptable as $value) { <BR>if (preg_match("{$value}",$Ip)) { <BR>$IsJoined = false; <BR>break; <BR>} <BR>} <BR>} <BR>// 如果在ip黑名单中就执行如下操作 <BR>if( !$IsJoined ){ <BR>echo "IP Error"; <BR>exit; <BR>} <BR>} <BR>private function get_client_ip(){ <BR>if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "<b style="color:transparent">来&源gao@dai!ma.com搞$代^码%网</b><img>搞gaodaima代码</img>unknown")) <BR>$ip = getenv("HTTP_CLIENT_IP"); <BR>else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) <BR>$ip = getenv("HTTP_X_FORWARDED_FOR"); <BR>else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) <BR>$ip = getenv("REMOTE_ADDR"); <BR>else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) <BR>$ip = $_SERVER['REMOTE_ADDR']; <BR>else <BR>$ip = "unknown"; <BR>return($ip); <BR>} <BR>} <BR>?><BR>
引用片段:
$oBlock_ip = new block_ip(); <BR>$oBlock_ip->checkIP();<BR>