はじめに
Laravel感覚で途中まで実装できていましたが、CSRF対策のところで躓きました。
実装するのに少し時間がかかってしまいました。
同じように悩む方の参考になればと思います。
インストールがまだの方
下記記事を参考にしてください。
注意
追記 8月15日
「ログイン済み」であることが条件と記載しておりましたがそのような条件はありません。
注意の内容自体が間違った内容でした。
取り消し線で消させて頂きます。
注意自体が間違っているとは...本当にすみません...
下記内容は「厳密なCSRFの用語の定義」を満たしていません。
CSRFの前提条件として「ログイン済み」であることが条件のためです。
あくまでもサンプルソースであることのご理解願います。
結論
※注意:session_start();でセッションの処理を開始しておく必要があります。
- CSRFトークンの送信側
form.php
<?php
require_once __DIR__."/vendor/autoload.php";
use eftec\bladeone\BladeOne;
// getCsrfToken内でsessionにtokenを格納しているため必要。
session_start();
// 読み込みを行いたいテンプレートパス記述
$views = __DIR__.'/views';
$cache = __DIR__.'/cache';
$blade = new BladeOne($views,$cache,BladeOne::MODE_AUTO);
// この記述がないとCSRFトークンのvalueがHTMLに出力されない。
$blade->getCsrfToken();
echo $blade->run("form");
form.blade.php
<form action="catch.php" method="POST">
@csrf
<button>送信</button>
</form>
- CSRFトークンの受信側
catch.php
<?php
require_once __DIR__."/vendor/autoload.php";
use eftec\bladeone\BladeOne;
// csrfIsValid内でsessionからtokenを取得しているため必要。
session_start();
$blade = new BladeOne();
if($blade->csrfIsValid() !== true) var_dump("エラー");