cakephp2.doc_022
最終投稿日:2019年11月20日
参照:http://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html
不正遷移等をお手軽に制御できる。
//コントローラ内で宣言する
public $components = array("Security");
※上記コンポーネントを利用する事で、Viewに自動的にTokenが発行される。
public function beforeFilter(){
parent::beforeFilter();
//不正遷移扱いになると同名の function が呼ばれる
$this->Security->blackHoleCallback = "securityError";
//同じドメインのPOST遷移を許可する(アクションは配列で記述)
$this->Security->requirePost(array('hoge','confirm'));
}
function securityError($type) {
echo "hoge......";exit;
}
※$type パラメータは、以下の値を持ちます
‘auth’ は、フォームバリデーションエラー、もしくはコントローラ/アクションの不適合エラー を示します。
‘csrf’ は、CSRF エラーを示します。
‘get’ は、HTTP メソッド制限の失敗を示します。
‘post’ は、HTTP メソッド制限の失敗を示します。
‘put’ は、HTTP メソッド制限の失敗を示します。
‘delete’ は、HTTP メソッド制限の失敗を示します。
‘secure’ は、SSL メソッド制限の失敗を示します。
他HTTPメソッド
$this->Security->requirePost()
$this->Security->requireGet()
$this->Security->requirePut()
$this->Security->requireDelete()
//アクションを SSL 通信に限定
$this->Security->requireSecure()
//Security コンポーネントで生成された正しいトークンが必要なアクションを設定します
$this->Security->requireAuth()
例)
delete アクションは POST リクエストを受け取った場合にのみ 正しく実行されます
public $components = array('Security');
public function beforeFilter() {
$this->Security->requirePost('delete');
}
管理者用ルーティングの全てのアクションは、SSL 通信のみを許可します
public $components = array('Security');
public function beforeFilter() {
if (isset($this->request->params['admin'])) {
$this->Security->requireSecure();
}
}
管理者用ルーティングの全てのアクションは、SSL 通信のみを許可します。
クエストが破棄対象になった時、 forceSSL() コールバック関数が呼ばれ、
非セキュアなリクエストを 自動的にセキュアなリクエストにリダイレクトします。
public $components = array('Security');
public function beforeFilter() {
if (isset($this->params['admin'])) {
$this->Security->blackHoleCallback = 'forceSSL';
$this->Security->requireSecure();
}
}
public function forceSSL() {
return $this->redirect('https://' . env('SERVER_NAME') . $this->here);
}
【CSRF 防御】
CSRF トークンは、30分間有効です。
コンポーネントの csfrExpires を設定することで有効期限を指定することができます。
public $components = array(
'Security' => array(
'csrfExpires' => '+1 hour'
)
);
または、コントローラの beforeFilter 中でこのプロパティをセットすることもできます
ublic function beforeFilter() {
$this->Security->csrfExpires = '+1 hour';
// ...
}
ワンタイムトークンの代わりにセッション単位のトークンを利用
フォルトで、新しい CSRF トークンが各リクエストで生成され、各トークンは一度だけ使用されます。
トークンが二度使用された場合、リクエストは破棄されます。しばしば、
シングルページアプリケーションで 問題が発生して、この振る舞いが好ましくないことがあります。
csrfUseOnce を false にすることで、長期間、複数回使用できるトークンに切り替える ことができます。
public function beforeFilter(){
$this->Security->csrfUseOnce = false;
}
CSRF 防御を無効化
// Post からの遷移(クロスドメイン含む)を許可(なので普段は記述しない)
$this->Security->validatePost = false;
// Ajax からの遷移(クロスドメイン含む)を許可(なので普段は記述しない)
$this->Security->csrfCheck = false;
//Userモデルの項目名「age」を無効化する
$this->Security->disabledFields = array('User.age');
【注意】