memcache实现基于IP的控制发帖次数
2010-04-09 13:12
337 查看
<?php /** * 基于IP、IPC的发帖控制方法 * */ class CCheckIPTime { /** * $this->$ipConditions:IP限制条件 $ipBlock :IP封杀时间 * * @var array */ private $ipConditions = array( '2'=>5, '10'=>60, '40'=>600, '100'=>3600, '500'=>86400 ); //key=>value 帖子数量 => 时间限制条件(单位:秒) private $ipBlock = array( '2'=>10, '10'=>120, '40'=>1200, '100'=>7200, '500'=>86400 ); //key=>value 帖子数量 => 封杀时间 (单位:秒) /** * $this->$ipcConditions:IP段限制条件 $ipcBlock:IP段封杀时间 * * @var array */ private $ipcConditions = array( '20'=>5, '50'=>60, '100'=>600, '200'=>3600, '1000'=>86400 ); //key=>value 帖子数量 => 时间限制条件(单位:秒) private $ipcBlock = array( '20'=>60, '50'=>600, '100'=>1200, '200'=>7200, '1000'=>86400 ); //key=>value 帖子数量 => 封杀时间 (单位:秒) /** * 根据限制条件,判断封杀时间 * * @return Boolean */ public function checkip($binfo, $ip) { if (!$this->isIp($ip)) { return false; } $mem = new Memcache; $mem->connect('127.0.0.1', 11211); $ipc = substr( $ip, 0, strrpos( $ip, "." )); $getMcIpc = $mem->get( $ipc ); $currTime = time(); if ( $getMcIpc ) { $ipcType = 0; // 限制类型 0为不限制 1,2,3,4,5为限制 $reIpcTimeType = 0; // 判断是否是超过有效时间,但发帖数量正常 0为没有超过有效时间且发帖数量正常; 1,2,3,4,5 为需要重置MC IP段 VALUE相应时间 $ipcLimitTime = 0; // IP段封杀时间(单位:秒) $arrIpcInfo = explode( "|", unserialize($getMcIpc) ); for ( $i=0;$i<count($arrIpcInfo);$i=$i+2 ) { $arrIpcInfo[$i] += 1; $checkIpcTime[] = $currTime - $arrIpcInfo[$i+1]; $checkIpcCount[] = $arrIpcInfo[$i]; } //判断限制类型 $bool = false; $ipcPostsCount = array_keys($this->ipcConditions); for ( $c=0; $c<count($checkIpcCount); $c++ ) { if ( $checkIpcTime[$c] <= $this->ipcConditions[$ipcPostsCount[$c]] && $checkIpcCount[$c] > $ipcPostsCount[$c] ) { $ipcLimitTime = $this->ipcBlock[$ipcPostsCount[$c]]; $ipcType = $c + 1; $bool = false; } elseif ( $checkIpcTime[$c] > $this->ipcConditions[$ipcPostsCount[$c]] && $checkIpcCount[$c] <= $ipcPostsCount[$c] ) { $reIpcTimeType = $c + 1; $bool = true; } } $resetType = $bool? $reIpcTimeType:$ipcType; // 重新生成MC IP段 value值 $strMcValueIpc = $this->strMcValue ( $resetType, $bool, $ipcLimitTime, $arrIpcInfo ); $tmpipc = serialize( $strMcValueIpc ); $ipcMcExpire = 237283 - $checkIpcTime[4]; $mem->set( $ipc, $tmpipc, 0, $ipcMcExpire ); if ( !$ipcType ) { $getMcIp = $mem->get( $ip ); if ( $getMcIp ) { $typeIp = 0; // 限制类型 0为不限制 1,2,3,4,5为限制 $reIpTimeType = 0; // 判断是否是超过有效时间,但发帖数量正常 0为没有超过有效时间且发帖数量正常; 1,2,3,4,5 为需要重置MC IP VALUE相应时间 $ipLimitTime = 0; // IP封杀时间(单位:秒) $arrIpInfo = explode( "|", unserialize($getMcIp) ); for ( $i=0;$i<count($arrIpInfo);$i=$i+2 ) { $arrIpInfo[$i] +=1; $checkIpTime[] = $currTime - $arrIpInfo[$i+1]; $checkIpCount[] = $arrIpInfo[$i]; } //判断限制类型 $bool = false; $ipPostsCount = array_keys( $this->ipConditions ); for ( $c=0; $c<count($checkIpCount); $c++ ) { if ( $checkIpTime[$c] <= $this->ipConditions[$ipPostsCount[$c]] && $checkIpCount[$c] > $ipPostsCount[$c] ) { $ipLimitTime = $this->ipBlock [$ipPostsCount[$c]]; $typeIp = $c + 1; $bool = false; } elseif ( $checkIpTime[$c] > $this->ipConditions[$ipPostsCount[$c]] && $checkIpCount[$c] <= $ipPostsCount[$c] ) { $reIpTimeType = $c + 1; $bool = true; } } $resetType = $bool ? $reIpTimeType : $typeIp; // 重新生成MC IP value值 $strMcValueIp = $this->strMcValue ( $resetType, $bool, $ipLimitTime, $arrIpInfo ); $ipMcExpire = 237283 - $checkIpTime[4]; $tmpip = serialize( $strMcValueIp ); $mem->set( $ip, $tmpip, 0, $ipMcExpire ); if ( $typeIp ) { // $type=2; // $target = $ip; $cdesc = "封杀IP 时间".$ipLimitTime; $this->mesleep( $ipLimitTime ); // return $cdesc; }else { return true; } } else { $ipCount = 1; $ipMcExpire = 237283; $strMcValueIp = $ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime; $tmpip = serialize( $strMcValueIp ); $mem->set( $ip, $tmpip, 0, $ipMcExpire ); return true; } } else { // $type=2; // $target = $ipc.".*"; $cdesc = "封杀IP段 时间".$ipcLimitTime; $this->mesleep( $ipcLimitTime ); // return $cdesc; } } else { $count = 1; $str = $count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime; $serStr = serialize( $str ); $mem->set( $ipc, $serStr, 0, 237283 ); $mem->set( $ip, $serStr, 0, 237283 ); return true; } } /** * 重新组织IP或IP段,value值 * * @return string */ private function strMcValue ( $type, $bool, $blocktime, $arr ) { $currTime = time(); $count = $bool ? 1:0; for ( $i=0; $i< $type*2; $i=$i+2 ) { $arr[$i] = $count; $arr[$i+1] = $blocktime + $currTime; } $str = $arr[0]."|".$arr[1]."|".$arr[2]."|".$arr[3]."|".$arr[4]."|".$arr[5]."|".$arr[6]."|".$arr[7]."|".$arr[8]."|".$arr[9]; return $str; } /** * 检查IP格式 * * @return Boolean */ private function isIp($ip) { if ( preg_match("/^[0-9]{1,3}(.[0-9]{1,3}){3}$/", $ip) ) { foreach(explode(".", $ip) as $octet) { if ($octet<1 || $octet>255) return false; } } else { return false; } return true; } /** * 使用sleep函数模拟封杀时间 * * @param int $num * @return Boolean */ private function mesleep( $num ) { sleep( $num ); return true; } } /*$mem = new Memcache; $mem->connect('127.0.0.1', 11211); $ip =" 212.31.72.3 "; $ipc = substr( $ip, 0, strrpos( $ip, "." )); for ($i=0;$i<50;$i++ ) { echo $mem->get( $ip ); echo "<br>"; echo $mem->get( $ipc ); echo "<br>"; $checkip = new CCheckIPTime(); $res = $checkip->checkip( '', $ip ); echo "发帖是否成功 ".date("H:i:s")." "; var_dump( $res ); echo "<br>"; } */ ?>
使用MC实现限制IP、IPC发帖数量。
相关文章推荐
- 基于java过滤器实现web系统的IP访问控制
- 基于java过滤器实现web系统的IP访问控制
- 如何用路由器实现基于用户/IP的流量控制
- 基于java过滤器实现web系统的IP访问控制
- 一种基于Redis的10行代码实现IP频率控制方法
- ASP.NET MVC 中如何实现基于角色的权限控制
- 基于repcached的 memcache 主从配置实现
- 基于 Struts 2 拦截器实现细粒度的基于角色的存取控制
- 基于Shiro 拦截URL,实现权限控制
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- 基于平均法线实现顶点网格变形控制的总结
- 基于tcp/ip的简单web服务器实现
- 基于ARP的局域网IP劫持——C语言实现
- 基于Vue实现微信三公棋牌网站搭建后台系统权限控制
- 续:【基于JFinal建立的Db+Record实现的数据库表字段加密】-- 实现事务控制
- zedboard--基于demo系统的用户ip核的添加和驱动编写(书13.2完整实现过程)(二十一)
- 基于tcp/ip实现的智能小区解决方案
- 基于HHARM9-EDU的TCP/IP(UDP)协议的实现
- 基于EasyIPCamera实现的数字网络摄像机IPCamera的模拟器IPC RTSP Simulator
- 使用IP ACL实现单向访问控制