免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2521 | 回复: 3
打印 上一主题 下一主题

对IP及IP段进行访问限制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-18 21:38 |只看该作者 |倒序浏览
本来是写了几个函数,IP黑名单是记到库里的,为了方便理解,改成了一个class把IP黑名单写了出来。
192.168.1.1 单个IP
192.168.1.*      这样代理   192.168.1.1-192.168.1-255
192.158.1.2-20 这样是代表192.158.1.2-192.158.1.20
也可以这样写  192.168.1.[1|2|3]

嘿嘿~一个方法不知道想法是否周全,拿出来大家讨论

使用方法:
$oBlock_ip = new block_ip();
$oBlock_ip->checkIP();

论坛徽章:
0
2 [报告]
发表于 2008-10-18 21:41 |只看该作者
代码:

  1. <?php
  2. class block_ip {
  3.        var $Block_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*");
  4.       
  5.        function __construct(){
  6.               
  7.        }
  8.       
  9.        function __destruct(){
  10.               
  11.        }
  12.       
  13.        private function makePregIP($str){
  14.               if (strstr($str,"-")) {
  15.                      $aIP = explode(".",$str);
  16.                      foreach ($aIP as $k=>$v) {
  17.                             if (!strstr($v,"-")) {
  18.                                    $preg_limit .= makePregIP($v);
  19.                             }       else{
  20.                                    $aipNum = explode("-",$v);
  21.                                    for($i=$aipNum[0];$i<=$aipNum[1];$i++){
  22.                                           $preg .=$preg?"|".$i:"[".$i;
  23.                                    }
  24.                                    $preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":".".$preg."]";
  25.                             }
  26.                      }
  27.               }else{
  28.                      $preg_limit .= $str.".";
  29.               }
  30.               return $preg_limit;
  31.        }

  32.        private function getAllBlockIP(){
  33.               if ($this->Block_ip) {
  34.                      foreach ($this->Block_ip as $k=>$v) {
  35.                             $ipaddres = $this->makePregIP($v->start_ip);
  36.                             $ip = str_ireplace(".","\.",$ipaddres);
  37.                             $ip  = str_replace("*","[0-9]{1,3}",$ip);
  38.                             $ipaddres  = "/".$ip."/";
  39.                             $ip_list[] = $ipaddres;
  40.                      }
  41.               }
  42.               return $ip_list;
  43.        }

  44.        public function checkIP() {
  45.               $iptable = $this->getAllBlockIP();
  46.               $IsJoined = true;
  47.               //取得用户ip
  48.               $Ip = $this->get_client_ip();
  49.               $Ip = trim($Ip);
  50.               //剔除黑名单中的IP区段
  51.               if ($iptable) {
  52.                      foreach($iptable as $value) {
  53.                             if (preg_match("{$value}",$Ip)) {
  54.                                    $IsJoined = false;
  55.                                    break;
  56.                             }
  57.                      }
  58.               }
  59.               //如果在ip黑名单中就执行如下操作
  60.               if( !$IsJoined ){
  61.                      echo "IP Error";
  62.                      exit;
  63.               }
  64.        }

  65.        private function get_client_ip(){
  66.               if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  67.               $ip = getenv("HTTP_CLIENT_IP");
  68.               else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
  69.               $ip = getenv("HTTP_X_FORWARDED_FOR");
  70.               else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
  71.               $ip = getenv("REMOTE_ADDR");
  72.               else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
  73.               $ip = $_SERVER['REMOTE_ADDR'];
  74.               else
  75.               $ip = "unknown";
  76.               return($ip);
  77.        }

  78. }
  79. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-10-19 00:35 |只看该作者
个人觉得,一种是比较专业的,用掩码方式,懂点的人都能理解
192.168.0.1/32 => 192.168.0.1
192.168.0.0/24
192.168.0.0/16
.....
或者
192.168.0.0/255.255.255.0方式,我更倾向上面的方式。

或者vb论坛的一个参考,很弱智但也很好理解
使用这个选项以阻止某个 IP 地址访问论坛的任何位置。

如果您输入了一个完整的 IP 地址 (242.21.11.7),仅该 IP 地址会被封禁。
如果您输入了一个不完整的 IP (243.21.11. 或 243.21.11),任何以这部分开头的 IP 地址都会被封禁。例如,封禁 243.21.11 将会阻止 243.21.11.7 访问论坛。但是,243.21.115.7 仍然可以访问论坛。

您也可以使用 * 作为通配符,使得封禁更为灵活。例如,如果您输入 243.21.11*,多个 IP 会被封禁,包括:243.21.11.7, 243.21.115.7, 243.21.119.225。

每个 IP 地址封禁条件以空格或回车分隔。



如果用的人比较专业用上面的,如果用的人不是很了解网络知识建议用下面的。

另:对 210.10.2.1-20 和 192.168.1.[1|2|3]  都不感冒,如果考虑正则,那还有很多情况。

我觉得规范统一更好点,个人意见,供参考。

论坛徽章:
0
4 [报告]
发表于 2008-10-19 12:25 |只看该作者
感谢 楼上 我再去研究一下其它产品的封IP的方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP