public function actionIndex() { $scheduleSeconds = (int) Yii::app()->params['csb']['checkScriptSchedule']; $fromCheckPointTime = date('Y-m-d H:i:s', strtotime("-{$scheduleSeconds} seconds")); $this->_verbose('Check long interval requests...'); CsbRequest::model()->checkLongIntervals(); // clear data CsbRequest::model()->deleteAll('time < :time', array(':time' => $fromCheckPointTime)); CsbIpInfo::model()->deleteAll('till_time < :time', array(':time' => date('Y-m-d H:i:s'))); $this->_sendNotification($fromCheckPointTime); }
public function testLongRequest() { $ip = '2.2.2.2'; // test 100 requests per 600 last seconds for ($i = 1; $i <= 100; $i++) { $request = new CsbRequest(); $request->ip = ip2long($ip); $request->time = date('Y-m-d H:i:s', strtotime("-" . $i * 5 . " second")); $request->save(); } CsbRequest::model()->checkLongIntervals(); // check logs $this->assertEquals(1, CsbIpInfo::model()->count('ip = :ip', array(':ip' => ip2long($ip)))); $this->assertEquals(1, CsbLog::model()->count('ip = :ip', array(':ip' => ip2long($ip)))); }
/** * Check suspicious user's behavior at long intervals * */ public function checkLongIntervals() { $longIntervals = Yii::app()->params['csb']['longIntervals']; foreach ($longIntervals as $interval) { $suspiciousRows = Yii::app()->db->createCommand()->select('INET_NTOA(ip) as ip, COUNT(*) as cnt')->from($this->tableName())->where('time > :time', array(':time' => date('Y-m-d H:i:s', strtotime("-{$interval['time']} second"))))->group('ip')->having("cnt >= {$interval['count']}")->queryAll(); foreach ($suspiciousRows as $row) { $details = array('current request count' => $row['cnt'], 'interval seconds' => $interval['time'], 'request threshold value' => $interval['count'], 'block time' => $interval['blockTime']); CsbIpInfo::model()->isBlockIp($row['ip'], $details); } } }
/** * Add new ip info * @param $ip * @param $type * @param $tillTime * @return CsbIpInfo */ public function addIpInfo($ip, $type, $tillTime) { $ipInfo = CsbIpInfo::model()->find('id = :ip', array(':ip' => ip2long($ip))); if (!$ipInfo) { $ipInfo = new CsbIpInfo(); $ipInfo->ip = ip2long($ip); } $ipInfo->setAttributes(array('ip_type' => $type, 'till_time' => $tillTime)); $ipInfo->save(); return $ipInfo; }