本文共 2695 字,大约阅读时间需要 8 分钟。
学校的新闻系统需要对访问权限进行IP地址控制,这可以通过简单的白名单机制来实现。具体来说,只需将允许访问的IP地址添加到ip.txt文件中,系统就会自动将这些IP地址设置为可访问的范围。为了满足实际需求,我们还支持C类IP地址的范围指定。
以下是实现该功能的最新代码版本:
$v) { if (!strstr($v, "-")) { $preg_limit .= $preg_limit ?: "[".$v."]"."; } else { $aipNum = explode("-", $v); for ($i = $aipNum[0]; $i <= $aipNum[1]; $i++) { $preg .= $preg ? "|" . $i : "[".$i"]"; } $preg_limit .= $preg ? "]" : $preg."]"; $preg_limit .= $preg_limit[strlen($preg_limit)-1] === "." ? "]" : "."; } } return $preg_limit; } else { return $str . "."; } } private function getAllBlockIP() { if (!empty($this->Block_ip)) { $ip_list = array(); foreach ($this->Block_ip as $k => $v) { $start_ip = $v; $ipaddres = $this->makePregIP($start_ip); $ip = str_ireplace(".", ".", $ipaddres); $ip = str_replace("*", "[0-9]{1,3}", $ip); $ipaddres = "/".$ip."/"; array_push($ip_list, $ipaddres); } return $ip_list; } return array(); } public function checkIP() { $iptable = $this->getAllBlockIP(); $IsJoined = true; $Ip = $this->get_client_ip(); $Ip = trim($Ip); if (!empty($iptable)) { foreach ($iptable as $value) { if (preg_match($value, $Ip)) { $IsJoined = false; break; } } } if (!$IsJoined) { echo "IP Error"; exit; } } private function get_client_ip() { $ip = "unknown"; if (isset($_SERVER['HTTP_CLIENT_IP']) && strcasecmp($_SERVER['HTTP_CLIENT_IP'], "unknown")) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], "unknown")) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) { $ip = $_SERVER['REMOTE_ADDR']; } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; }} 以下是代码的使用示例:
$block_ip = new block_ip();$block_ip->checkIP();
这个解决方案通过将IP地址存储在文本文件中实现了简单的访问控制机制。系统会自动读取这些IP地址,并检查访问者的IP地址是否允许访问。这种方式既直观又灵活,支持单个IP地址、IP地址范围以及C类IP地址的 wildcard 模式。
转载地址:http://ujtfk.baihongyu.com/