システムの準備
スクリプトはphpで記述されており、sqlite3を使用してphp-cliとphp5-sqlite3をインストールする必要があることに関する情報を保存します。
私の場合、システムはubuntで発生するため、このように配置されます
sudo apt-get install php5-cli php5-sqlite
スクリプト自体。
仕事の原理はこれです。 スクリプトは、発信者の電話番号を受け取ります。 データベースに番号を入力し、すでに呼び出した回数をチェックし、これをルールと照合します(スクリプトの最初の行で設定されます)。 制限を超えている場合-「停止」という単語を返し、そうでない場合は「継続」を返します
<?php $rules = array( 60 => 2, // 2 ( 60 ) 3600 => 10 // 10 ( 3600 ) ); if (!$argv[1] ) die("please use: '" . $argv[0] . " phone_number' \nfor example: ".$argv[0]." 88121234567\n"); // $db = new SQLite3('/tmp/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'); ?>
アスタリスクへの接続
Answer()コマンドまたは「removes」行を開く他のコマンドを呼び出す前に、最初の行でスクリプトを実行することが重要です。
exten => 8800XXXXXXX,1,Set(resp=${SHELL(php /home/scripts/antiddos.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(); ...
行に従ってダイヤルプランを分析しましょう:
1)Set(resp = $ {SHELL(php /home/scripts/antiddos.php $ {CALLERID(num)})});
スクリプトを呼び出して、スクリプトにコンソールに出力された値に対応する変数を割り当てます
2)Gosubif($ [$ {resp} == stop]?$ {EXTEN}、$ {MATH($ {PRIORITY} +1)、int}:$ {EXTEN}、$ {MATH($ {PRIORITY} +2 )、int});
値が「停止」の場合は、現在のダイヤルプランの次の指示に進みます。HangUp()チームは、
それ以外の場合は、回線を通過してダイヤルプランを続行します。
最終的に何が起こるか。
制限を超えていない場合、次のSIPセッションが取得されます。
sip provider me invite => <= trying <= OK ack =>
それですべてが大丈夫、充電が開始されました
HandUp()を実行すると、SIPセッションは次のようになります。
sip provider me invite => <= trying <= DECLINE ack =>
拒否とは、呼び出されたユーザーが着信を拒否したことを意味します。 課金を開始しないでください、なぜなら 会話はなく、セッションは終了しました。
UPD:
匿名の番号から攻撃する場合、スクリプトを少し変更して、anti-AONによって閉じられた番号に制限を設定できます...