編集:私は最初にこれを言っておくべきだった、私はFronEndでAngularJSを使用している、と私はXHR経由ですべての要求をしている。すべてのユーザーリクエストに対してCSRF Token
を使用してアプリケーションを開発しています。
各リクエストの後にToken
を再生成する必要がありますか?
何かのようなもの
Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)
または、各ユーザーSession
と同じものを使用するだけで十分ですか?
メリットはありますか?
Laravel 5 Bladesテンプレートを使用すると、非常に簡単です。
Csrfトークンの値のみが必要な場合は、次のように記述して生成できます。
{{ csrf_token() }}
次のようなトークン値を生成します。
7YC0Sxth7AYe4RFSjzaPf2ygLCecJhPbyXhz6vvF
フォームを使用している場合は、フォーム内に次のコード行を追加できます。
{{ csrf_field() }}
次のようなhtmlが生成されます。
<input type="hidden" name="_token" value="7YC0Sxth7AYe4RFSjzaPf2ygLCecJhblahblah">
Laravelはあなたのためにこれを行うべきです、あなたは_token
の作成/削除を管理する必要はありません
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
こちらのドキュメントの「CSRF保護」セクションを参照してください。 http://laravel.com/docs/security
依存します。攻撃者がMITMではない場合、WebアプリとAPIサーバー間のトラフィックを傍受できないという意味で、セッション全体の単一のCSRFトークンで十分です。
サーバー側の機密性の高い操作も保護すると想定します(つまり、リソースの所有者のみにリソースへのアクセスを許可します(「アカウントの削除」など)。)トークンにより、リクエストを行うブラウザが正当で認証されますユーザーのブラウザ。心配する必要があるのはそれだけです。
一方、攻撃者がWebアプリとAPIの間の安全でないトラフィックを見ることができる場合、CSRFトークンとsession_idを手に入れ、悪事を透過的に行う可能性があります。このような場合、各リクエスト(POST、または機密性の高い操作を行う種類)のトークンを付与、使用、およびその後破棄すると、ジョブが少し難しくなりますが、それでも運命にあります。
私の2セント...
Laravel 5.6を使用している場合、フォームの上部で次の操作を実行して、CSRFトークンの非表示の入力フィールドを作成します
@csrf
CSRFトークンは、Cookieトークンとサーバートークンを比較することにより、クロスサイト攻撃を防ぎます。
Csrfトークンをlaravel by csrf_token()
ヘルパー関数で生成できます。完全なcsrfフィールドが必要な場合は、csrf_field()
関数を使用でき、csrf内部ロジックは
function csrf_field()
{
return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
}
新しいリクエストが生成されるとき、laravel=毎回ランダムなトークンを作成し、保存後にブラウザのクッキーとセッションに保存しますcookie == session token
のように互いに比較します
Laravel内部ロジックは次のとおりです。VerifyCsrfToken
ミドルウェアで見つけることができます。
/**
* Determine if the session and input CSRF tokens match.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
/**
* Get the CSRF token from the request.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
$token = $this->encrypter->decrypt($header);
}
return $token;
}
/**
* Add the CSRF token to the response cookies.
*
* @param \Illuminate\Http\Request $request
* @param \Symfony\Component\HttpFoundation\Response $response
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function addCookieToResponse($request, $response)
{
$config = config('session');
$response->headers->setCookie(
new Cookie(
'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
$config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
)
);
return $response;
}