読者です 読者をやめる 読者になる 読者になる

dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト12-20・・・DoS攻撃対策をする

 自分で連続投稿のコードを動かしてみると DoS攻撃対策の必要性を痛感します。何せハードディスクが唸りを上げて連続動作しています。これでは他のユーザーはサイトが壊れたように見えるでしょうね。ということで、対策です。

 

DoS攻撃対策を考える

 ユーザー側はいかなるリクエストでも連続して発行するコードを組むことが可能です。従って、あらゆるケースを想定して対策を考える必要があります。

・悪意の判定というのは結構難しい問題です。毎回内容を変えて投稿するようにコードを仕組むのは簡単ですから、同一内容チェックは無意味です。

・投稿の内容が意味不明という判定をするのは困難です。

・要するに短い時間間隔で投稿とかを何回もリクエストしてくるのは悪意があると考えるしかありません。

・例えば60秒以内の再投稿をリジェクトします。これでも10時間で600件の投稿が可能ですから、一般ユーザーは迷惑するでしょう。まあ、発見したら管理人がアカウントを削除するんでしょうけど。

・1日の投稿件数を20件以内に抑えるなんていうのも有効だと思います。

・時間間隔判定は一般的なクッキーを使う方法が比較的に確実で簡単だと思います。ユーザーサイドでクッキーを偽造できるのかが問題ですが、調べてないので分かりません。

 

記事の連続投稿対策

・kohana/application/classes/controller/test12/postnew.php の部分

            if ($post->check()) {

                $post_time = Cookie::get('post_time');
                if (!$post_time)
                    die('Invalid!');
                $interval = $id ? 10 : 60;
                if (time() - $post_time > $interval) {
                    Cookie::set('post_time', time());

・投稿ページに入ってきたらクッキーをセットしておきます。
・POSTされた投稿をチェックして、エラーが無いと判定したら書き込み処理を行う前にクッキーのチェックをします。
・新規投稿は60秒ルールにしますが、投稿の修正は繰り返しても人に迷惑をかけないので10秒ルールにしました。
・パスしたら再びクッキーをセットして、書き込み処理を続行します。

 ブラウザからクッキーを抜き取ってロボットでクッキーも送るようなことが出来ると想定すると破られちゃうのですが、そんな事って出来るんですかね? もし出来るとすると、セッションチェックにする必要があります。

 

写真の容量を制限する

 写真の登録は Uploadify を使って元々連続投稿出来る仕様になっています。容量制限をしていなかったので、機能を追加します。

・データベースのテーブル wp332_post_images に写真のサイズを入れるカラム data_size を追加しました。
・ユーザーの現在の合計サイズを返すモデルを作ります。

・kohana/application/classes/model/test12/posts.php に追加

    public function gettotalimagesize($post_author) {
        $sql = "select sum(data_size) from wp332_post_images where post_author = " . $post_author;
        $query = DB::query(Database::SELECT, $sql)
                ->execute();
        return $query->get('sum(data_size)');
    }

  kohana の DB::Select には SQL の SUM を扱うメソッドが準備されていないので、SQL 文をもろに書いています。

 あとは写真1枚毎に現在の合計サイズをチェックして、容量制限値を超えていればアップロードのエラーを発生させることにします。

 

動作確認

 悪意のある攻撃に対して防御壁をかなり高く設定できたと思います。その筋の専門家なら越えて来るように思いますけど。

 コードの詳細は github のリポジトリを参照して下さい。
  => kohana-3.2-sample-code