このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
apricot:ext:csrf [2020/05/24 14:38] y2sunlight [CSRF対策の設定] |
apricot:ext:csrf [2020/06/08 11:06] tanaka [CsrfTokenクラス] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | > | ||
- | |||
- | ----- | ||
- | |||
====== Apricot CSRF対策 ====== | ====== Apricot CSRF対策 ====== | ||
--- // | --- // | ||
行 37: | 行 33: | ||
|static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。| | |static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。| | ||
- | これらのメソッドは[[# | + | これらのメソッドは[[# |
CsrfTokenクラスを以下に示します。 | CsrfTokenクラスを以下に示します。 | ||
行 198: | 行 194: | ||
* middleware にミドルウェア \App\Middleware\Auth\VerifyCsrfToken:: | * middleware にミドルウェア \App\Middleware\Auth\VerifyCsrfToken:: | ||
- | * csrf.disposable はCSRFトークンを使い捨てするか否かの設定を行います。既定値はfalse(セッション内で同じ)です。 | + | * csrf.disposable はCSRFトークンを使い捨てするか否かの設定を行います(既定値: false)。 |
* true --- 使い捨てにする(リクエスト毎に発行) | * true --- 使い捨てにする(リクエスト毎に発行) | ||
* false --- 使い捨てにしない(セッション内で同じ) | * false --- 使い捨てにしない(セッション内で同じ) | ||
行 239: | 行 235: | ||
===== HTMLテンプレートの修正 ===== | ===== HTMLテンプレートの修正 ===== | ||
+ | |||
+ | これまでに作成したフォーム画面のHTMLテンプレートを修正し、@csrfディレクティブを追加します。 | ||
+ | |||
+ | ==== ユーザ登録画面 ==== | ||
+ | |||
+ | ユーザ登録の新規登録画面と編集画面のテンプレートを修正します。 | ||
+ | |||
+ | === 新規登録画面のテンプレート === | ||
+ | |||
+ | {{fa> | ||
+ | <code php create.blade.php> | ||
+ | {{-- コンテンツ --}} | ||
+ | @section(' | ||
+ | <form method=" | ||
+ | @csrf | ||
+ | ... | ||
+ | </ | ||
+ | @endsection | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | === 編集画面のテンプレート === | ||
+ | |||
+ | {{fa> | ||
+ | <code php edit.blade.php> | ||
+ | {{-- コンテンツ --}} | ||
+ | @section(' | ||
+ | <form method=" | ||
+ | @csrf | ||
+ | ... | ||
+ | </ | ||
+ | @endsection | ||
+ | </ | ||
+ | |||
+ | * '' | ||
\\ | \\ | ||
===== テスト実行 ===== | ===== テスト実行 ===== | ||
+ | |||
+ | CSRF対策のテストをしてみましょう。Apricotのユーザ編集画面にアクセスします。 | ||
+ | |||
+ | [{{apricot: | ||
+ | ■ [保存]ボタンを押して下さい。 | ||
+ | |||
+ | |||
+ | [{{apricot: | ||
+ | ■ 正常に保存できます。\\ | ||
+ | ■ 先に修正したユーザ編集画面の '' | ||
+ | |||
+ | <div indent 60%> | ||
+ | {{fa> | ||
+ | <code php create.blade.php> | ||
+ | .... | ||
+ | <form method=" | ||
+ | {{--@csrf --}} | ||
+ | ... | ||
+ | </ | ||
+ | .... | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ■ ユーザ編集画面で再び[保存]ボタンを押すと次の画面が出ます。 | ||
+ | |||
+ | [{{apricot: | ||
+ | ■ '' | ||
+ | ■ これは CSRFトークンがサーバーに送信されていないので発生する例外です。\\ | ||
+ | ■ 尚、本番用のエラー画面を出力したい場合は、.env の '' | ||
+ | |||
+ | <div indent 60%> | ||
+ | <code ini .env> | ||
+ | .... | ||
+ | APP_DEBUG=false | ||
+ | .... | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | テスト後は、'' | ||
\\ | \\ |