ThinkPHP6プロジェクトの基本操作(18.フォームトークントークンアンチCSRFの実際の戦闘部分)

0.はじめに

、重複送信フォームを防止するためにトークンを形成するクロスサイトリクエスト偽造を防止するために(Cross-site request forgery)も知られているone-click attackまたはsession riding、一般に略さCSRFまたはXSRF

1.TP6トークンの使用

1.1フォームの送信

デフォルトのテンプレートエンジンを使用する場合は、次の方法を直接使用できます。

<input type="hidden" name="__token__" value="{:token()}" />

直接使用することもできます

{:token_field()}

デフォルトのトークントークン名は__token__名前をカスタマイズする必要ある場合、トークン生成ルールを使用できます。

{:token_field('__hash__', 'md5')}

2番目のパラメーターtokenは生成ルールを表し、クロージャーも使用できます。

1.2AJAX提出

AJAXによって送信されたフォームの場合は、tokenメタで設定できます

<meta name="csrf-token" content="{:token()}">

または直接使用する:

{:token_meta()}

次にAjax、このメソッドを使用してX-CSRF-Tokenリクエストヘッダーを設定し、グローバルに送信します。

$.ajaxSetup({
    
    
    headers: {
    
    
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

2.TP6トークンの検証

2.1ルート検証

次に、ルーティングルールの定義で、

Route::post('blog/save','blog/save')->token();

token名前をカスタマイズする場合は、次のように変更する必要があります

Route::post('blog/save','blog/save')->token('__hash__');

トークンチェックが失敗した場合、think\exception\ValidateException例外がスローされます。

2.2コントローラーの検証

コントローラでの手動トークン検証

namespace app\controller;

use think\exception\ValidateException;
use think\Request;

class Index
{
    
    
    public function index(Request $request)
    {
    
    
        $check = $request->checkToken('__token__');
        
        if(false === $check) {
    
    
            throw new ValidateException('invalid token');
        }

        // ...
    }
}

変更されているtokentoken存在しない場合、エラーが報告されます。
ここに写真の説明を挿入

2.3検証者の検証

検証ルールに、トークン検証ルールを追加するだけです

protected $rule = [
    'name'  =>  'require|max:25|token',
    'email' =>  'email',
];

トークン名がそうでない場合__token__(そうであると仮定__hash__)、バリデーターを次のように変更する必要があります。

protected $rule = [
    'name'  =>  'require|max:25|token:__hash__',
    'email' =>  'email',
];

おすすめ

転載: blog.csdn.net/zy1281539626/article/details/112081702