Vous êtes sur la page 1sur 8

Qu'est-ce que la falsification de requête

intersite (CSRF) ? Tutoriel de sécurité


Web Laravel
Dans ce cours, vous découvrirez la sécurité Web de
Laravel et comment sécuriser vos applications Web
et les protéger contre la contrefaçon de requête
intersite ou les attaques CSRF.
CSRF est une activité malveillante qui implique qu'un attaquant
effectue des actions au nom d'un utilisateur
authentifié. Heureusement, Laravel fournit des mesures prêtes à
l'emploi pour prévenir ce type de vulnérabilité. Cross-Site
Request Forgery (CSRF) est un type d'attaque effectué par
l'attaquant pour envoyer des demandes à un système avec l'aide
d'un utilisateur autorisé auquel le système fait confiance.

Dans ce cours, vous apprendrez :


• Qu'est-ce que le CSRF ?
• Comment empêcher une requête CSRF
• Comment et où la vérification CSRF se produit
Qu'est-ce que le CSRF ?
Les attaques CSRF détournent les sessions utilisateur. Pour ce
faire, ils incitent un utilisateur à envoyer une demande via des
balises de formulaire masquées ou des URL malveillantes
(images ou liens) à l'insu de l'utilisateur.

Cette attaque entraîne une modification de l'état de la session


utilisateur, des fuites de données et les attaquants peuvent
parfois manipuler les données des utilisateurs finaux dans une
application.
Explicatif CSRF
L'image ci-dessus illustre ce scénario dans lequel un acteur
(utilisateur) envoie une requête de malware.xyz via le serveur
Web à application.xyz . Ils réalisent alors que leurs
informations ont été manipulées en mettant à jour leur mot de
passe .
Comment empêcher les requêtes CSRF
Laravel fournit une protection contre les attaques CSRF en
générant un jeton CSRF . Ce jeton CSRF est généré
automatiquement pour chaque utilisateur. Ce jeton n'est rien
d'autre qu'une chaîne aléatoire gérée par l'application Laravel
pour vérifier les demandes des utilisateurs.

Pour chaque session utilisateur, Laravel génère des jetons


sécurisés qu'il utilise pour s'assurer que l'utilisateur authentifié
est celui qui demande l'application.

Comme ce jeton change à chaque fois qu'une session utilisateur


est régénérée, un attaquant malveillant ne peut pas y accéder.

Cette protection de jeton CSRF peut être appliquée à n'importe


quel formulaire HTML dans l'application Laravel en spécifiant un
champ de formulaire caché du jeton CSRF. Les requêtes sont
validées automatiquement par le middleware CSRF
VerifyCsrfToken .
Vous pouvez le faire de trois manières différentes.

• @csrf
• champ_csrf()
• csrf_token()

Chaque fois qu'il y a une demande de modification des


informations utilisateur côté serveur (back-end)
comme POST, PUT, PATCH et DELETE, vous devez inclure un @csrf
dans la demande de formulaire HTML. La @csrf est donc une
directive Blade utilisée pour générer un jeton caché validé par
l'application.
@csrf : il s'agit d'une directive de modèle de lame pour générer
le champ d'entrée masqué dans le formulaire HTML.

• Syntaxe:
• <form method="POST">
• @csrf // Génère un champ de saisie caché
• .....
• .....
</form>

csrf_field() : cette fonction peut être utilisée pour générer le


champ de saisie masqué dans le formulaire HTML.
Remarque : Cette fonction doit être écrite à l'intérieur
d'accolades doubles.
• Syntaxe:
• <form method="POST"<

• // Générer un champ de saisie caché


• {{ csrf_field() }}
• .....
• .....
</form>

csrf_token() : cette fonction donne simplement une chaîne


aléatoire. Cette fonction ne génère pas le champ de saisie
masqué.
Remarque : le champ de saisie HTML doit être écrit
explicitement. Cette fonction doit être écrite à l'intérieur de
doubles accolades.
• Syntaxe:
• <form method="POST">
• <input type="hidden" name="_token" value="{{ csrf_token() }}">
• .....
• .....
• </form>

Sortie : la sortie sera la même pour l'une des trois manières ci-
dessus de générer un jeton CSRF. Le champ de jeton CSRF doit
être écrit/généré au début de chaque formulaire HTML, en
utilisant l'une des trois méthodes, dans une application Laravel.

Inspecter la sortie de l'élément :


csrf_token() caché dans les versions antérieures de Laravel
Lorsque le jeton CSRF n'est pas présent dans la demande de
formulaire envoyée ou s'il semble invalide, Laravel lance un
message d'erreur "Page expirée" avec un code d'état 419.

Page Laravel 419 expirée


Comment et où la vérification CSRF se produit
Le VerifyCsrfToken middleware gère la vérification CSRF dans
l'application Laravel. Le middleware est enregistré dans
Kernel.php et se trouve dans le groupe de middleware de route
Web de l'application. Cela signifie que le middleware est
déclenché pour les requêtes sur le Web, non liées aux API.
protected $middlewareGroups = [
'web' => [
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
Le middleware VerifyCsrfToken étend
la Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
classe. Cela signifie que la vérification CSRF est hébergée dans la
classe.
Approfondissons pour savoir comment Laravel gère la
vérification CSRF.
Dans la classe, nous avons la tokensMatch fonction.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);

return is_string($request->session()->token()) &&


is_string($token) &&
hash_equals($request->session()->token(), $token);
}
Déterminez si les jetons CSRF de session et d'entrée
correspondent.
La fonction fait deux choses :

1. $this->getTokenFromRequest obtient le jeton de la requête


entrante jointe via un champ masqué ou l'en-tête de la
requête. Le jeton est déchiffré puis renvoyé à la variable jeton.
protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

if (! $token && $header = $request->header('X-XSRF-TOKEN')) {


try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header,
static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}

return $token;
}
Obtenir le jeton de l'en-tête
2. Convertissez le jeton de requête et la session en une chaîne,
puis utilisez le hash_equals intégré de PHP pour comparer
si les deux chaînes sont égales en utilisant la même
heure. Le résultat de cette opération est toujours un bool
(true) ou (false) .
Jetons CSRF & JavaScript
Lors de la création d’applications pilotées par JavaScript, il est
préférable de configurer votre bibliothèque HTTP JavaScript de
façon à joindre le jeton CSRF à chaque requête. Par défaut, la
librairie HTTP Axios dans le
fichier resources/js/bootstrap.js envoie automatiquement un
en-tête X-XSRF-TOKEN avec la valeur du cookie chiffré XSRF-
TOKEN. Si vous n’utilisez pas cette librairie, vous devrez
configurer cela vous même dans votre application.

Exclusion d’URIs de la Protection CSRF


Parfois, vous voudrez exclure un ensemble d’URIs de la
protection CSRF. Par exemple, si vous utilisez Stripe pour traiter
les paiements et utilisez leur système de webhook, il vous sera
nécessaire d’exclure la route vers la cible du webhook de Stripe
(sur votre application) de la protection CSRF étant donné que
Stripe ne saura pas quel jeton CSRF envoyer à votre route.

Typiquement, vous devriez sortir ce genre de route du groupe de


middleware web que le RouteServiceProvider applique à toutes
les routes dans le fichier routes/web.php. Cependant, vous
pouvez aussi exclure des routes en ajoutant leurs URIs à la
propriété $except du middleware VerifyCsrfToken:
<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware


{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}
Le middleware CSRF est automatiquement désactivé lors
des tests.
X-CSRF-TOKEN
En plus de vérifier le jeton CSRF dans les données POST, le
middleware VerifyCsrfToken vérifiera aussi l’en-tête HTTP X-
CSRF-TOKEN. Vous pourriez, par exemple, stocker le jeton dans
une balise HTML meta:
<meta name="csrf-token" content="">

Ensuite, après avoir créé la balise meta, vous pouvez configurer


une bibliothèque comme jQuery pour qu’elle ajoute
automatiquement le jeton dans les en-têtes de chaque requête.
Cela permet une protection CSRF simple et convenient pour
votre application basée sur AJAX:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-
token"]').attr('content')
}
});

X-XSRF-TOKEN
Laravel stocke le jeton CSRF actuel dans un cookie chiffré XSRF-
TOKEN qui est inclut dans chaque réponse générée par le
framework. Vous pouvez utiliser la valeur du cookie comme
valeur de l’en-tête X-XSRF-TOKEN.

Ce cookie est principalement envoyé par commodité car certains


frameworks et bibliothèques JavaScript, comme Angular et
Axios, utilisent automatiquement sa valeur dans l’en-tête X-
XSRF-TOKEN header sur les requêtes à destination de
l’application (same-origin).
Par défaut, le fichier resources/js/bootstrap.js inclut la librarie
HTTP Axios qui l’enverra automatiquement pour vous.

Vous aimerez peut-être aussi