テーマメディア:インタビューチャレンジ

最近、同様のトピックがプロジェクトのページに頻繁に登場するという事実に照らして、私はタスクを公開します。かなり長い間、求職者に当社のPHP開発者の地位を提供してきました。







したがって、必要なものは次のとおりです。Webサーバーへの呼び出しのログがあります。Apacheかnginxかは関係ありません(両方のオプションを提供する方が良い)。このログの登録中にサーバーがddos攻撃を受けたことがわかります。 攻撃ノードのアドレスを特定してブロックするために、できるだけ迅速かつ正確にスクリプトを作成する必要があります。



災害でブロックされたグーグルは、大災害ではないと理解されています。 検索エンジンのリストを取得し、適切な修正を加えることは難しくありません。



もちろん、与えられたパラメータに基づく決定の精度と速度は、攻撃の強さ(周期性、関係するノードの数)に応じて変化します。



私は、問題が発生した後に自分で書いた解決策を同封します。その瞬間は、特に「短気」でした。 解決策は非常にシンプルでラフですが、同時に効果的です(20秒で80メガバイトのログ)。 このスクリプトは、1,500台のローファーがサーバーで破損したときに、プロジェクトの1つを攻撃の1つから保護するのに役立ちました。



時間の経過とともに、攻撃ではトラフィック自体を評価する方がより正確であることが明らかになりました(より詳細で時間のかかるアプローチ、より頻繁に遭遇する人は誰でも)-パケットの内容、ヘッダー、しかしそれにもかかわらず、経験はこの問題を解決することが明白であることを示しました経験豊富な開発者であり、Webプログラミングの分野で「犬を食べた」と主張する専門家のレベルのアイデア。



決定は1時間から2回(人の思考の経過に応じて)行われ、最後に解決されたのは1時間20分でした。 合計で、申請者の約10%が問題を解決しました。



ここで別のタスクがあります。



ソースコード:必要に応じて、ログストリームまたはファイルからファイアウォールをブロックルールを追加できます。 正規表現を拒否すると、生産性が大幅に向上します。 最大500メガバイトのサイズのファイルでテスト済み。



もちろん、これは少し短く、真珠の上にきれいに書くことができますが、私はPHPで問題に対する何らかの解決策を作成したかったのです。



  #!/ usr / local / bin / php
 <?php
   if(!empty($ argv [1]))$ fname = $ argv [1]; それ以外の場合$ fname = 'access.log';
   $ fh = fopen($ fname、 'r');
   #$ fh = fopen( 'php:// stdin'、 'r');
   $ timeLimit = 1;
   $ countLimit = 50;
   $ status = array();

   while($ string = fgets($ fh)){
        $ ip = substr($ string、0、strpos($ string、 ''));

        if(!empty($ status [$ ip] ['blocked']))続行;

        $ st = strpos($ string、 '[')+ 1;
        $ time = strtotime(substr($ string、$ st、strpos($ string、 ']'、$ st + 1)-$ st));

        $ st = strpos($ string、 '"')+ 1;
        $ req = substr($ string、$ st、strpos($ string、 '"'、$ st + 1)-$ st);
        $ st = strpos($ req、 "")+ 1;
        $ doc = substr($ req、$ st、strpos($ req、 ""、$ st)-$ st);

        $ dot = strrpos($ doc、 "。");
        $ dot = $ dot?  strlen($ doc)-$ドット:0;
        if(!$ dot || $ dot> 5){
           if(!empty($ status [$ ip]))$ status [$ ip] = array( 'count' => 0);
           if(!empty($ status [$ ip] ['time'])&& $ time-$ status [$ ip] ['time'] <= $ timeLimit){
               $ status [$ ip] ['count'] ++;
               if($ status [$ ip] ['count']> = $ countLimit){
                   echo "$ ip:$ doc \ n";
		   #system( "ipfw table 1 add $ ip");
		   #echo "$ ip \ n";
                   $ status [$ ip] ['blocked'] = 1;
               }
           }

           $ status [$ ip] ['time'] = $ time;
           $ status [$ ip] ['doc'] = $ doc;
        }
   }
 ?> 



All Articles