フォームトークントークン
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');
}
// ...
}
}
変更されているtoken
かtoken
存在しない場合、エラーが報告されます。
2.3検証者の検証
検証ルールに、トークン検証ルールを追加するだけです
protected $rule = [
'name' => 'require|max:25|token',
'email' => 'email',
];
トークン名がそうでない場合__token__
(そうであると仮定__hash__
)、バリデーターを次のように変更する必要があります。
protected $rule = [
'name' => 'require|max:25|token:__hash__',
'email' => 'email',
];