Защита Asterisk при хаке на номер 8-800
Удобная затычка? Для тех кто не сильно любит дарить халяву.
Астериск всему голова.. Особенно когда правильно на строен. Теперь поговорим о защите…
Для начала поставим нужный нам софт
Ваше исполнение может быть любым и под ваши дальнейшие планы.
apt-get install php5-cli php5-sqlite
Скрипт
Сохраним его по адерсу: /usr/local/asterisk/bin/8800.php
2, // Не более 2 звонков в минуту ( 60 секунд ) 3600 => 10 // Не более 10 звонков в час ( 3600 секунд ) ); if (!$argv[1] ) die("please use: '" . $argv[0] . " phone_number' nfor example: ".$argv[0]." 88001234567n"); // Открываем или создаем БД $db = new SQLite3('/var/db/sqlite.db'); $db->exec('CREATE TABLE IF NOT EXISTS logs (phone bigint(12), datetime int(12))'); // Добавляем номер и дату звонка в базу $phone = preg_replace('/[^0-9]/','', $argv[1]); $db->exec("INSERT INTO logs (phone, datetime) VALUES ( '".$phone."','".time()."' )"); foreach( $rules as $secs => $limit ) { $res = $db->query( "SELECT count(*) as `c` FROM logs WHERE `phone` = '".$phone."' AND `datetime` >= " .( time() - $secs ) ); $row = $res->fetchArray(); // Если привышен лимит if ( $row['c'] > $limit ) { die('stop'); // возвращаем stop и выходим из скрипта } } // Очистка мусора $max_period = max(array_keys($rules) ); $db->exec("DELETE FROM logs WHERE `datetime` < " .( time() - $max_period )); // возвращаем continue die('continue'); ?>
Правим диалплан asterisk`а
exten => 8800XXXXXXX,1,Set(resp=${SHELL(php /usr/local/asterisk/bin/8800.php ${CALLERID(num)})}); exten => 8800XXXXXXX,2,Gosubif($[${resp}==stop]?${EXTEN},${MATH(${PRIORITY}+1),int}:${EXTEN},${MATH(${PRIORITY}+2),int}); exten => 8800XXXXXXX,3,HangUp(); exten => 8800XXXXXXX,4,Answer();
Всем удачи!