#はじめに
CakePHP2でFormヘルパーを使わずにformタグを直書きしたい場合、
CSRFトークンのタグだけを出力するメソッドが
フレームワーク側で用意されていないためCSRF対策で困ることになります。
今回はCSRFトークンのタグを出力する方法を書きます。
#環境
PHP 7.3
CakePHP 2.10
Smarty3
#実装方法
###1.ヘルパーを作成
View/Helperディレクトリに以下のクラスを作成します。
(クラス名などは適当に)
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が推奨している方法ではないので、この方法で安全とは保証はできません。
あくまでも自己責任でおねがいします。