cakephp2.doc_022
R e i - D r e a m
for Laravel
TOP > CakePHP2 > Component関連(Security)
Guest
login

最終投稿日:2019年11月20日

Component関連(Security)
CakePHP2.x
参照: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');
            
【注意】
Security コンポーネントを使用している時、フォームの作成に FormHelper を 使わなければなりません。
また、フィールドの “name” 属性を 上書きしてはいけません。
Security コンポーネントは、FormHelper で作成され、 管理されるインジケーターを確認します。
(これらは create() と end() の中で作成されます。)
例えば JavaScript で無効化・ 削除・新規作成するなどして POST リクエスト中の投稿されたフィールドを動的に差し替えることは、 リクエストが破棄されるきっかけになります。
$validatePost や $disabledFields 設定で回避する。
レンズモード 【新規購入限定用】
ログインしてコメントを残そう!!


きっぷる