requireAuthでCSRF対策

主にCSRF対策目的で、SecurityコンポーネントのrequireAuthチェックを導入しました。

基本の導入はできましたが、対策した方がよさそうな懸念や、改善したい点もあり。


実装は、以下を参考にしました。
CakePHPでCSRF対策 - Shin x blog

違い

  • ビューファイルへのToken埋め込み

ver.1.2.5では、$form->create()および$form->end()が自動で行なってくれます。
というか、この2つを使わないとエラーになります。特に$form->end();。

$form->end();が発行するfieldトーク*1が、フォーム改ざんハッキング防止のカギなので、その意味でも$form->end();で閉じるのが鉄則です。

  • bakeが書いたview

ver1.2.5では、bakeで作ったviewも$form->create()&$form->end()仕様になっているのでそのまま使えます。

  • BlackHoleの設定

Cookbookを参考に、エラー時に簡単なメッセージを出すように実装しました。
真っ白だと何が起こったのかわからないので ^^;

不満や懸念など

  • 別のアクションにアクセスするとトークンが切れる

出典
http://www.cmplc.cc/2008/04/05/515/

    • 特定のアクションでのみトークンを発行する

http://www.cmplc.cc/2008/05/06/519/
という対策が挙げられてますが、


ニ窓操作で編集画面2つ開いたら、意味がない・・・・


長文編集行なった挙句に消えたら、イヤになりますよねえ・・・。

  • AU携帯でTokenを受け取れない

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1899&forum=3
・・・・これ、fieldset外すのが手っ取り早くて簡単ですよね・・・発言者さんは気乗りしない方法ですが。。
 携帯は、凝ったタグ使わないのが懸命。

  • requireAuthに指定してない画面のフォームにもTokenが入る

 特に携帯は、要らないパケット送りたくないんですが・・・

  • モデルのcrudマッピングで、add,update,delete設定のアクションは必ずチェック、とかできないか

主な実装差分

Index: controllers/app_controller.php
===================================================================
--- controllers/app_controller.php      (revision 194)
+++ controllers/app_controller.php      (working copy)

 class AppController extends Controller
 {

-       var $components = array('AuthPlus', 'Acl');
+       var $components = array('AuthPlus', 'Acl', 'Security');

        /* ACL */
        // 追加アクション用 crudMap
@@ -30,19 +31,26 @@
        {
                parent::beforeFilter();

+               // CSRF設定
+               $this->Security->blackHoleCallback = "securityError";
+
                if ($this->AuthPlus) {
                        // ACL関連
                        $this->AuthPlus->actionPath = 'controllers/';
                        $this->AuthPlus->authorize = 'crud';

@@ -174,6 +182,12 @@
                }

        }
+
+       /* Security Error */
+       function securityError($error)
+       {
+               die($error." ERROR!");
+       }
 }


Index: controllers/users_controller.php
===================================================================
--- controllers/users_controller.php    (revision 194)
+++ controllers/users_controller.php    (working copy)
@@ -16,8 +16,24 @@
                parent::beforeFilter();

+               $this->Security->requireAuth(
+                       "add",
+                       "mobile_add",
+                       "admin_add",
+                       "edit",
+                       "mobile_edit",
+                       "admin_edit",
+                       "change_password",
+                       "mobile_change_password",
+                       "admin_change_password",
+                       "delete",
+                       "mobile_delete",
+                       "admin_delete"
+               );
+

*1:仮名