0
0

More than 3 years have passed since last update.

CakePHP2でformタグ直書きでCSRF対策

Last updated at Posted at 2019-10-30

はじめに

CakePHP2でFormヘルパーを使わずにformタグを直書きしたい場合、
CSRFトークンのタグだけを出力するメソッドが
フレームワーク側で用意されていないためCSRF対策で困ることになります。

今回はCSRFトークンのタグを出力する方法を書きます。

環境

PHP 7.3
CakePHP 2.10
Smarty3

実装方法

1.ヘルパーを作成

View/Helperディレクトリに以下のクラスを作成します。
(クラス名などは適当に)

View/Helper/MyFormHelper.php
App::uses('FormHelper', 'View/Helper');

class MyFormHelper extends FormHelper {
    public function csrfField(){
        return $this->_csrfField();
    }
}

デフォルトのFormHelperにて、
_csrfFieldメソッドがCSRFトークンのinputタグを出力しているのですが、
protectedで定義してあったので、継承してpublicメソッドでラッピングしただけです。

2.ヘルパーをViewで使用する

お好きなコントローラの$helpersに
さきほど作成したクラスを追加して
View側のformタグ内でメソッドを実行すればOKです。

class AppController extends Controller {
    ~
    public $helpers = array('MyForm');
    ~
}
<form action="" method="POST">
{$this->MyForm->csrfField()}
<button type="submit">送信</button>
</form>

3.セキュリティコンポーネントの設定

ついでにSecurityコンポーネントの設定も

$this->Security->validatePost = false; // フォーム改ざん検知をOFF
$this->Security->csrfCheck = true;  // CSRFトークンチェックをON
$this->Security->csrfUseOnce = false; // CSRFトークンの使用回数1回の制限をOFF Ajaxを使用する場合必要

今回フォーム改ざん検知用のタグは出力していないので
validatePost=false

CSRFトークンチェックを有効にしたいため
csrfCheck=true

AjaxでCSRFトークンを使用する場合は使用回数1回の制限解除する必要があるので
csrfUseOnce=false

まとめ

CakePHPが推奨している方法ではないので、この方法で安全とは保証はできません。
あくまでも自己責任でおねがいします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0