このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
apricot:ext:csrf [2020/05/24 12:09] y2sunlight [BladeOneのカスタマイズ] |
apricot:ext:csrf [2020/06/08 11:16] (現在) tanaka [ミドルウェア] |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | > | ||
| - | |||
| - | ----- | ||
| - | |||
| ====== Apricot CSRF対策 ====== | ====== Apricot CSRF対策 ====== | ||
| --- // | --- // | ||
| 行 37: | 行 33: | ||
| |static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。| | |static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。| | ||
| - | これらのメソッドは[[# | + | これらのメソッドは[[# |
| CsrfTokenクラスを以下に示します。 | CsrfTokenクラスを以下に示します。 | ||
| - | {{fa> | + | {{fa> |
| <code php CsrfToken.php> | <code php CsrfToken.php> | ||
| <?php | <?php | ||
| 行 117: | 行 113: | ||
| {{fa> | {{fa> | ||
| - | <code php CsrfToken.php> | + | <code php VerifyCsrfToken.php> |
| <?php | <?php | ||
| namespace App\Middleware; | namespace App\Middleware; | ||
| 行 163: | 行 159: | ||
| </ | </ | ||
| - | * TODO | + | * [[# |
| - | * TODO | + | |
| - | * TODO | + | * $this< |
| + | * CsrfToken:: | ||
| + | * 失敗の場合 | ||
| + | * TokenMismatchException 例外をスローします。\\ この例外は[[apricot: | ||
| + | * 成功の場合 | ||
| + | * CsrfToken:: | ||
| + | * 前処理の後、次の Invoker の invoke() メソッドを呼び出します。 | ||
| \\ | \\ | ||
| 行 191: | 行 193: | ||
| </ | </ | ||
| - | * TODO | + | * middleware にミドルウェア \App\Middleware\Auth\VerifyCsrfToken:: |
| - | * TODO | + | * csrf.disposable はCSRFトークンを使い捨てするか否かの設定を行います(既定値: |
| + | * true --- 使い捨てにする(リクエスト毎に発行) | ||
| + | * false --- 使い捨てにしない(セッション内で同じ) | ||
| \\ | \\ | ||
| 行 198: | 行 202: | ||
| ===== BladeOneのカスタマイズ ===== | ===== BladeOneのカスタマイズ ===== | ||
| - | テンプレートエンジンである[[basic-library: | + | テンプレートエンジンである[[basic-library: |
| {{fa> | {{fa> | ||
| 行 231: | 行 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 | ||
| + | .... | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | テスト後は、'' | ||
| \\ | \\ | ||