Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


apricot:ext:csrf

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:ext:csrf [2020/05/24 12:10]
y2sunlight [BladeOneのカスタマイズ]
apricot:ext:csrf [2020/06/08 11:16] (現在)
tanaka [ミドルウェア]
行 1: 行 1:
->編集中 
- 
------ 
- 
 ====== Apricot CSRF対策 ====== ====== Apricot CSRF対策 ======
  --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-05-15//  --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-05-15//
行 37: 行 33:
 |static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。| |static\\ generate()|セッション内のCSRFトークンが未生成の場合、生成してセッションに格納します。|
  
-これらのメソッドは[[#ミドルウェア|ミドルウェア]]で使用することを想定しています。HTMLに埋め込むCSRFトークンはセッションから取得して下さい(後述の[[#BladeOneのカスタマイズ|BladeOneのカスタマイズ|]]を参照)。+これらのメソッドは[[#ミドルウェア|ミドルウェア]]で使用することを想定しています。HTMLに埋め込むCSRFトークンはセッションから取得して下さい(後述の[[#BladeOneのカスタマイズ|BladeOneのカスタマイズ]]を参照)。
  
 CsrfTokenクラスを以下に示します。 CsrfTokenクラスを以下に示します。
  
-{{fa>folder-open-o}} ** /apricot/core/Security/ **+{{fa>folder-open-o}} ** /apricot/core/Foundation/Security **
 <code php CsrfToken.php> <code php CsrfToken.php>
 <?php <?php
行 117: 行 113:
  
 {{fa>folder-open-o}} ** /apricot/app/Middleware ** {{fa>folder-open-o}} ** /apricot/app/Middleware **
-<code php CsrfToken.php>+<code php VerifyCsrfToken.php>
 <?php <?php
 namespace App\Middleware; namespace App\Middleware;
行 163: 行 159:
 </code> </code>
  
-  * TODO +  * [[#Middleware インターフェース|Middleware インターフェース]]の process() メソッドを実装します。 
-  * TODO + 
-  * TODO+  * $this<nowiki>->exclude</nowiki> 配列に含まれているコントローラは認証から除外します。(公開のWebAPIなど) 
 +  * CsrfToken::verify() メソッドでCSRFトークンの検証を行います。 
 +    * 失敗の場合 
 +      * TokenMismatchException 例外をスローします。\\ この例外は[[apricot:app:error#集約例外コントローラ|集約例外コントローラ]]でHTTPステータスコード 419 として処理されます。 
 +    * 成功の場合 
 +      * CsrfToken::generate() で CSRFトークンの生成を試みます。 
 +      * 前処理の後、次の Invoker の invoke() メソッドを呼び出します。
  
 \\ \\
行 191: 行 193:
 </code> </code>
  
-  * TODO +  * middleware にミドルウェア \App\Middleware\Auth\VerifyCsrfToken::class を追加します。 
-  * TODO+  * csrf.disposable はCSRFトークンを使い捨てするか否かの設定を行います(既定値: false)。 
 +    * true --- 使い捨てにする(リクエスト毎に発行)  
 +    * false --- 使い捨てにしない(セッション内で同じ)
  
 \\ \\
行 231: 行 235:
  
 ===== HTMLテンプレートの修正 ===== ===== HTMLテンプレートの修正 =====
 +
 +これまでに作成したフォーム画面のHTMLテンプレートを修正し、@csrfディレクティブを追加します。
 +
 +==== ユーザ登録画面 ====
 +
 +ユーザ登録の新規登録画面と編集画面のテンプレートを修正します。
 +
 +=== 新規登録画面のテンプレート ===
 +
 +{{fa>folder-open-o}} ** /apricot/assets/views/user **
 +<code php create.blade.php>
 +{{-- コンテンツ --}}
 +@section('content')
 +    <form method="POST" name="fm">
 +        @csrf
 +        ...
 +    </form>
 +@endsection
 +</code>
 +
 +  * ''form'' タグの下に ''@csrf'' を追加します。
 +
 +=== 編集画面のテンプレート ===
 +
 +{{fa>folder-open-o}} ** /apricot/assets/views/user **
 +<code php edit.blade.php>
 +{{-- コンテンツ --}}
 +@section('content')
 +    <form method="POST" name="fm">
 +        @csrf
 +        ...
 +    </form>
 +@endsection
 +</code>
 +
 +  * ''form'' タグの下に ''@csrf'' を追加します。
  
 \\ \\
  
 ===== テスト実行 ===== ===== テスト実行 =====
 +
 +CSRF対策のテストをしてみましょう。Apricotのユーザ編集画面にアクセスします。
 +
 +[{{apricot:ext:ext01.png?nolink}}]
 +■ [保存]ボタンを押して下さい。 
 +
 +
 +[{{apricot:ext:ext02.png?nolink}}]
 +■ 正常に保存できます。\\ 
 +■ 先に修正したユーザ編集画面の ''@csrf'' ディレクティブをコメントにして下さい。 
 +
 +<div indent 60%>
 +{{fa>folder-open-o}} ** /apricot/assets/views/user **
 +<code php create.blade.php>
 +....
 +    <form method="POST" name="fm">
 +        {{--@csrf --}}
 +        ...
 +    </form>
 +....
 +</code>
 +</div>
 +
 +■ ユーザ編集画面で再び[保存]ボタンを押すと次の画面が出ます。
 +
 +[{{apricot:ext:ext03.png?nolink}}]
 +■ ''VerifyCsrfToken Error'' のメッセージと共にWhoopsのエラー画面が出力されます。\\ 
 +■ これは CSRFトークンがサーバーに送信されていないので発生する例外です。\\
 +■ 尚、本番用のエラー画面を出力したい場合は、.env の ''APP_DEBUG'' をfalseに設定してからテストして下さい。
 +
 +<div indent 60%>
 +<code ini .env>
 +....
 +APP_DEBUG=false
 +....
 +</code>
 +</div>
 +
 +テスト後は、''@csrf'' や ''APP_DEBUG'' を元に戻しておいて下さい。
  
 \\ \\
apricot/ext/csrf.1590289834.txt.gz · 最終更新: 2020/05/24 12:10 by y2sunlight