虎绿林防止cc的限速代码
虎绿林防止cc的限速代码
PHP · 09-11 11:57 · 58阅读
<?php # 防止CC攻击 hu60_cc_prevent(); function hu60_cc_prevent() { global $ENABLE_CC_BLOCKING, $CC_DATA, $CC_LIMIT, // 数组, $CC_LIMIT[0] 秒内最多访问 $CC_LIMIT[1] 次 $CC_USE_MEMCACHE, $CC_BLOCK_LOG, $CC_ACCESS_LOG, $CC_IP_LIMIT, $CC_REAL_IP; // 记录数,决定记录文件的大小 $CC_RECORD_NUM = 256 * 256; // 单个记录字节数 $CC_RECORD_SIZE = 6; if (!$ENABLE_CC_BLOCKING) { return; } if (empty($CC_REAL_IP)) { $CC_REAL_IP = $_SERVER['REMOTE_ADDR']; } if (isset($CC_IP_LIMIT[$CC_REAL_IP])) { $CC_LIMIT[1] = $CC_IP_LIMIT[$CC_REAL_IP]; } // 当前时间,uint16 $currTime = unpack('v', pack('v', $_SERVER['REQUEST_TIME'])); $currTime = $currTime[1]; // IP hash,代表记录在文件中的位置 $ipHash = (hexdec(substr(md5($CC_REAL_IP), 0, 8)) % $CC_RECORD_NUM) * $CC_RECORD_SIZE; if ($CC_USE_MEMCACHE) { $key = "cc/$ipHash"; $record = cache::get($key); } else { if (!is_file($CC_DATA) || filesize($CC_DATA) < $CC_RECORD_NUM * $CC_RECORD_SIZE) { file_put_contents($CC_DATA, str_repeat("", $CC_RECORD_NUM * $CC_RECORD_SIZE)); } $CC_DATA = fopen($CC_DATA, 'r+'); fseek($CC_DATA, $ipHash); $record = fread($CC_DATA, $CC_RECORD_SIZE); } $record = unpack('v3', $record); // 首次访问时间 $firstAccTime = $record[1]; // 最后访问时间 $lastAccTime = $record[2]; // 访问次数 $accCount = ++$record[3]; if ($firstAccTime <= 0) { $firstAccTime = $currTime; } if ($lastAccTime <= 0) { $lastAccTime = $currTime; } $timeDiff = $currTime - $firstAccTime; if ($timeDiff < 0) { // uint16溢出时会发生 $firstAccTime = $currTime; $lastAccTime = $currTime; $accCount = 1; $timeDiff = $CC_LIMIT[0]; } elseif ($timeDiff < $CC_LIMIT[0]) { // 不够n秒,补充到n秒 $timeDiff = $CC_LIMIT[0]; } $block = false; if ($accCount / $timeDiff > $CC_LIMIT[1] / $CC_LIMIT[0]) { $block = true; $needWaitSeconds = ($accCount / $timeDiff - $CC_LIMIT[1] / $CC_LIMIT[0]) * $CC_LIMIT[0]; hu60_cc_output($needWaitSeconds, $timeDiff, $accCount); // 超速访问日志 if ($CC_BLOCK_LOG) { hu60_cc_log($CC_BLOCK_LOG, '超速', $timeDiff, $accCount); } } else { // 正常用户访问日志 if ($CC_ACCESS_LOG) { hu60_cc_log($CC_ACCESS_LOG, '正常', $timeDiff, $accCount); } } $lastTimeDiff = $currTime - $lastAccTime; // 上次访问距离这次访问经过了很久,且未超速,重置统计 if (!$block && ($lastTimeDiff > $CC_LIMIT[0] || $lastTimeDiff < 0)) { $firstAccTime = $currTime; $lastAccTime = $currTime; $accCount = 1; $timeDiff = $CC_LIMIT[0]; } $record = pack('v3', $firstAccTime, $currTime, $accCount); if ($CC_USE_MEMCACHE) { cache::set($key, $record); } else { fseek($CC_DATA, $ipHash); fwrite($CC_DATA, $record); fclose($CC_DATA); } if ($block) { exit; } } function hu60_cc_log($file, $stat, $timeDiff, $accCount) { global $CC_REAL_IP; $fp = fopen($file, 'a+'); fwrite($fp, "[" . date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . "] <$stat,{$timeDiff}秒{$accCount}次> $CC_REAL_IPt[PATH] $_SERVER[REQUEST_URI]t[REF] $_SERVER[HTTP_REFERER]n"); fclose($fp); } function hu60_cc_output($needWaitSeconds, $timeDiff, $accCount) { global $CC_LIMIT, $CC_REAL_IP; header('HTTP/1.1 403 Forbidden'); header('Content-Type: text/html; charset=UTF-8'); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>刷新不规范,虎友两行泪</title> </head> <body> <h4> 虎绿林第三区交通委提醒您:<br/> 网址千万条,耐心第一条。<br/> 刷新不规范,虎友两行泪。 </h4> 虎绿林低速网络限速<?=$CC_LIMIT[0]?>秒内最多访问<?=$CC_LIMIT[1]?>次(每秒<?=round($CC_LIMIT[1] / $CC_LIMIT[0], 2)?>次)。<br/> 您在<?=$timeDiff?>秒内访问了<?=$accCount?>次(每秒<?=round($accCount / $timeDiff, 2)?>次),您已超速。<br/> 作为惩罚,吊销您的虎绿林通行证<?=round($needWaitSeconds, 2)?>秒钟,在这段时间内您将不能访问虎绿林。<br/> 您的IP地址为<?php echo $CC_REAL_IP; ?>,违章记录已存档。 请勿反复刷新,否则违章记录将延续。<br/> </body> </html> <?php } 配置代码 <?php /////////////////// 防止CC攻击 /////////////////// /** * 是否启用防CC模块 */ $ENABLE_CC_BLOCKING = true; /** * 使用memcache */ $CC_USE_MEMCACHE = false; /** * CC行为记录文件 * * 请指定到tmpfs文件系统内,否则性能会很差。 * 如系统为Windows,请使用memcache,这样就不需要指定该文件。 */ $CC_DATA = '/dev/shm/hu60-cc.dat'; /** * CC行为日志 * * 设为null禁用 */ $CC_BLOCK_LOG = '/tmp/hu60-cc.log'; /** * 正常访问日志 * * 设为null禁用 */ $CC_ACCESS_LOG = null; /** * CC判定范围 */ $CC_LIMIT = [ 10, // n秒内 10, // 最多访问n次 ]; /** * 特定IP判定范围 */ $CC_IP_LIMIT = [ // 设置特定IP n秒最多能访问的次数 '127.0.0.1' => 100, ]; /** * 真实IP * * 开头加#禁用,删除#启用 */ // 无代理时使用 $CC_REAL_IP = $_SERVER['REMOTE_ADDR']; // 采用CloudFlare或百度云加速代理时使用 #$CC_REAL_IP = $_SERVER['HTTP_CF_CONNECTING_IP'];文章相关源代码来自:老虎会游泳
全部回复 0 条
爱你 抱抱 不活了 不要 超人 大哭 嗯嗯 发呆 飞呀 奋斗 尴尬 感动 害羞 嘿咻 画圈圈 惊吓 敬礼 快跑 路过 抢劫 杀气 上吊 调戏 跳舞 万岁 我走了 喜欢 吓死人 嚣张 疑问 做操