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が入る
特に携帯は、要らないパケット送りたくないんですが・・・
主な実装差分
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:仮名