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:仮名