web-dev-qa-db-fra.com

Laravel Token CSRF

EDIT: J'aurais dû le dire au début, j'utilise AngularJS dans le FronEnd, et je fais toute la demande via XHR. Je développe une application en utilisant CSRF Token pour chaque demande de l'utilisateur.

Dois-je régénérer le Token après chaque demande?

Quelque chose comme

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

Ou suffit-il d'utiliser le même à chaque utilisateur Session?

Y a-t-il un avantage?

8

Avec Laravel 5 utilisant des modèles Blades, c'est assez facile.

Si vous ne voulez que la valeur du jeton csrf, vous pouvez la générer en écrivant:

{{ csrf_token() }}

qui génère la valeur du jeton comme ceci:

7YC0Sxth7AYe4RFSjzaPf2ygLCecJhPbyXhz6vvF

Si vous utilisez des formulaires, vous pouvez ajouter la ligne de code suivante à l'intérieur du formulaire:

{{ csrf_field() }}

qui va générer du HTML comme ceci:

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

Laravel devrait faire cela pour vous, vous n'avez pas besoin de gérer la création/suppression de _token

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

Voir la section "Protection CSRF" dans les documents ici: http://laravel.com/docs/security

8
duellsy

Dépend. Si l'attaquant n'est pas MITM, dans le sens où il ne peut pas espionner le trafic entre votre application Web et le serveur API, un seul jeton CSRF pour toute la session devrait suffire.

En supposant que vous gardiez également les opérations sensibles côté serveur (c.-à-d. N'autorisez l'accès aux ressources qu'au propriétaire de la ressource, par exemple "supprimer mon compte", etc.), le jeton garantirait que le navigateur qui fait la demande est légitime, authentifié navigateur de l'utilisateur. C'est tout ce dont vous devriez vous inquiéter, je pense.

D'un autre côté, si l'attaquant est capable de regarder le trafic non sécurisé entre l'application web et votre API, il peut s'emparer du jeton CSRF et de votre session_id et faire du mal de manière transparente. Dans ce cas, l'octroi, l'utilisation et ensuite la suppression d'un jeton pour chaque demande (POST, ou tout autre type qui effectue une opération sensible) ne fait que rendre leur travail un peu plus difficile, mais vous êtes toujours condamné.

Mes 2 cents ...

5
hlev

Si vous utilisez Laravel 5.6, procédez comme suit en haut des formulaires pour créer un champ de saisie masqué pour le jeton CSRF

  @csrf
5
Joyal

Le jeton CSRF empêche les attaques intersites en comparant le jeton de cookie au jeton de serveur.

Vous pouvez générer un jeton csrf dans laravel par csrf_token() fonction d'assistance. Si vous voulez des champs csrf complets, vous pouvez utiliser la fonction csrf_field() et la logique interne csrf est

function csrf_field()
{
   return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
}

Quand une nouvelle demande générera alors laravel crée un jeton aléatoire à chaque fois et stocke dans le cookie et la session du navigateur après l'avoir stocké. Comparez-les les uns aux autres comme cookie == session token

La logique interne de Laravel suit et vous pouvez la trouver dans VerifyCsrfToken Middleware.

/**
 * 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