This document is for CakePHP's development version, which can be significantly different
from previous releases.
You may want to read
current stable release documentation instead.
フォーム保護コンポーネントは、フォームデータの改ざんから保護する仕組みを提供します。
すべてのコンポーネントと同様に、いくつかの設定可能なパラメータを使用して設定します。
これらのプロパティはすべて直接設定するか、コントローラの initialize()
メソッドや
beforeFilter()
メソッドの中にある同じ名前のセッターメソッドを使って設定することができます。
もし、startup()
コールバックでフォームデータを処理する他のコンポーネントを使用している場合は、
initialize()
メソッドの中で、必ず FormProtection Component を
それらのコンポーネントの前に置いてください。
注釈
FormProtectionコンポーネントを使用するときは、必ず FormHelperを使用して
フォームを作成してください。また、フィールドの「名前」属性を上書き してはいけません 。
FormProtection コンポーネントは、FormHelper によって作成・管理される特定の指標を探します。
(特に Cake\View\Helper\FormHelper::create()
と
Cake\View\Helper\FormHelper::end()
で作成されたもの)
POST リクエストで送信される動的なフィールド変更 (JavaScriptによる無効化、削除、新規フィールドの作成など) を使用すると、フォームトークンのバリデーションに失敗する可能性が高くなります。
デフォルトでは FormProtectionComponent
はユーザが特定の方法で
フォームを改ざんすることを防ぎます。例えば、次のようなことを防ぐことができます。
フォームのアクション(URL)は変更できません。
未知のフィールドをフォームに追加することはできません。
フォームからフィールドを削除することはできません。
隠し入力の値を変更することはできません。
このようなタイプの改ざんを防ぐには FormHelper
を使って
どのフィールドがフォームにあるかを追跡することで可能になります。
隠されたフィールドの値も追跡されます。これらのデータはすべて結合されてハッシュ化され、
隠されたトークンフィールドは自動的にフォームに挿入されます。
フォームが送信されると、FormProtectionComponent
は
POSTデータを使って同じ構造を作り、ハッシュを比較します。
注釈
FormProtectionComponent はセレクトボックスのオプションの追加や変更を防ぎ *ません* 。 また、ラジオボタンのオプションの追加や変更も防ぎません。
セキュリティコンポーネントの設定は通常コントローラの
initialize()
または beforeFilter()
コールバックで行われます。
利用可能なオプションは以下の通りです。 :
false
に設定すると、POSTリクエストのバリデーションを完全にスキップし、
本質的にフォームのバリデーションをオフにします。
POSTのバリデーションから除外するフォームフィールドのリストを設定します。
フィールドのロックを解除するには、コンポーネントで行うか
FormHelper::unlockField()
を使用します。
ロックが解除されたフィールドは POST の一部である必要はありませんし、
ロックが解除されていない非表示のフィールドの値はチェックされません。
POSTのバリデーションチェックから除外するアクションを設定します。
バリデーションに失敗した場合に呼び出すコールバックを指定します。 有効なClosureでなければなりません。 デフォルトでは未設定で、検証に失敗した場合は例外がスローされます。
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\EventInterface;
class WidgetsController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('FormProtection');
}
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
if ($this->request->getParam('prefix') === 'Admin') {
$this->FormProtection->setConfig('validate', false);
}
}
}
上記の例では、管理者用プレフィックス付きルートのフォーム改ざん防止機能を無効にしています。
アクションに対してフォームの改ざん防止を無効にしたい場合があるかもしれません。
(例えばAJAXリクエストの場合)
これらのアクションを beforeFilter()
内の $this->Security->unlockedActions
にリストアップすることで「ロックを解除」することができます。
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\EventInterface;
class WidgetController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('FormProtection');
}
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->FormProtection->setConfig('unlockedActions', ['edit']);
}
}
この例では、編集アクションのすべてのセキュリティチェックを無効にします。
フォーム保護の検証に失敗した場合、デフォルトでは400エラーになります。
この動作は validationFailureCallback
設定オプションを
コントローラのコールバック関数に設定することで設定できます。
コールバックメソッドを設定することで、失敗処理の動作をカスタマイズすることができます。
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->FormProtection->setConfig(
'validationFailureCallback',
function (BadRequestException $exception) {
// You can either return a response instance or throw the exception
// received as argument.
}
);
}