web-dev-qa-db-ja.com

Laravel CSRFトークン

編集:私は最初にこれを言っておくべきだった、私はFronEndでAngularJSを使用している、と私はXHR経由ですべての要求をしている。すべてのユーザーリクエストに対してCSRF Tokenを使用してアプリケーションを開発しています。

各リクエストの後にTokenを再生成する必要がありますか?

何かのようなもの

Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)

または、各ユーザーSessionと同じものを使用するだけで十分ですか?

メリットはありますか?

8

Laravel 5 Bladesテンプレートを使用すると、非常に簡単です。

Csrfトークンの値のみが必要な場合は、次のように記述して生成できます。

{{ csrf_token() }}

次のようなトークン値を生成します。

7YC0Sxth7AYe4RFSjzaPf2ygLCecJhPbyXhz6vvF

フォームを使用している場合は、フォーム内に次のコード行を追加できます。

{{ csrf_field() }}

次のようなhtmlが生成されます。

<input type="hidden" name="_token" value="7YC0Sxth7AYe4RFSjzaPf2ygLCecJhblahblah">
16
madarasz

Laravelはあなたのためにこれを行うべきです、あなたは_tokenの作成/削除を管理する必要はありません

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

こちらのドキュメントの「CSRF保護」セクションを参照してください。 http://laravel.com/docs/security

8
duellsy

依存します。攻撃者がMITMではない場合、WebアプリとAPIサーバー間のトラフィックを傍受できないという意味で、セッション全体の単一のCSRFトークンで十分です。

サーバー側の機密性の高い操作も保護すると想定します(つまり、リソースの所有者のみにリソースへのアクセスを許可します(「アカウントの削除」など)。)トークンにより、リクエストを行うブラウザが正当で認証されますユーザーのブラウザ。心配する必要があるのはそれだけです。

一方、攻撃者がWebアプリとAPIの間の安全でないトラフィックを見ることができる場合、CSRFトークンとsession_idを手に入れ、悪事を透過的に行う可能性があります。このような場合、各リクエスト(POST、または機密性の高い操作を行う種類)のトークンを付与、使用、およびその後破棄すると、ジョブが少し難しくなりますが、それでも運命にあります。

私の2セント...

5
hlev

Laravel 5.6を使用している場合、フォームの上部で次の操作を実行して、CSRFトークンの非表示の入力フィールドを作成します

  @csrf
5
Joyal

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;
}
1
Paresh Barad