セキュリティクラス

セキュリティクラスには CSRF 攻撃からの保護に役立つメソッドがあります。

ライブラリの読み込み

If your only interest in loading the library is to handle CSRF protection, then you will never need to load it, as it runs as a filter and has no manual interaction.

If you find a case where you do need direct access though, you may load it through the Services file:

$security = \Config\Services::security();

クロスサイトリクエストフォージェリ(CSRF)

You can enable CSRF protection by altering your app/Config/Filters.php and enabling the csrf filter globally:

public $globals = [
        'before' => [
                //'honeypot'
                'csrf'
        ]
];

ホワイトリストとして URI を指定することもできます(例えば外部から POST するための API エンドポイント)。フィルタの例外として URL を追加します:

public $globals = [
        'before' => [
                'csrf' => ['except' => ['api/record/save']]
        ]
];

正規表現もサポートしています(大文字小文字は区別しません):

public $globals = [
            'before' => [
                    'csrf' => ['except' => ['api/record/[0-9]+']]
            ]
    ];

もし フォームヘルパ も使うなら、 form_open() を使えば CSRF 隠しフィールドが自動的にフォームに追加されます。使わないなら、 csrf_token() 関数と csrf_hash() 関数がいつでも使えます

<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />

Additionally, you can use the csrf_field() method to generate this hidden input field for you:

// 生成します: <input type="hidden" name="{csrf_token}" value="{csrf_hash}" />
<?= csrf_field() ?>

トークンは送信ごとに再生成することもできますし(デフォルトはこれです)、CSRF クッキーのライフタイムを通じて同じものにすることもできます。デフォルトの再生成はセキュリティ的により厳密ですが、通常利用で不正操作とみなされることがあります(ブラウザ進む・戻る操作、複数タブ・ウィンドウ操作、非同期処理など)。次の設定を編集することで振る舞いを変えることができます

public $CSRFRegenerate  = true;

When a request fails the CSRF validation check, it will redirect to the previous page by default, setting an error flash message that you can display to the end user. This provides a nicer experience than simply crashing. This can be turned off by editing the $CSRFRedirect value in app/Config/App.php:

public $CSRFRedirect = false;

Even when the redirect value is true, AJAX calls will not redirect, but will throw an error.

その他の便利メソッド

セキュリティクラスのメソッドのほとんどは直接利用の必要がありません。これから記載するのメソッドは CSRF 攻撃保護とは関係のないものですが、手助けになるでしょう。

sanitizeFilename()

ファイル名をサニタイズします。ディレクトリトラバーサル攻撃やその他のセキュリティ脅威に対して用意するためです。特にユーザ入力を通じて提供されたファイルで有用です。第1引数はサニタイズするパスです。

もしユーザ入力に include の相対パスを許可するなら、例えば file/in/some/approved/folder.txt ですが、オプション第2引数の $relative_path に true を渡してください。

$path = $security->sanitizeFilename($request->getVar('filepath'));