Protection CSRF
CROSS SI T E REQUEST FORGERY
Introduction
▪ Les falsifications de requêtes intersites sont un type d'exploit
malveillant par lequel des commandes non autorisées sont
exécutées au nom d'un utilisateur authentifié. Heureusement,
Laravel facilite la protection de votre application contre les
attaques de cross-site request forgery (CSRF)
Une explication de la vulnérabilité
▪ Si vous n'êtes pas familier avec les falsifications de requêtes
intersites, discutons d'un exemple de la façon dont cette
vulnérabilité peut être exploitée. Imaginez que votre
application dispose d'une route /user/email qui accepte une
demande POST de modification de l'adresse e -mail de
l'utilisateur authentifié. Très probablement, cette route
s'attend à ce qu'un champ de saisie email contienne l'adresse
e-mail que l'utilisateur souhaite commencer à utiliser.
Prévenir les requêtes CSRF
Une explication de la vulnérabilité
▪ Sans protection CSRF, un site Web malveillant pourrait créer
un formulaire HTML qui pointe vers la route /user/email de
votre application et soumet la propre adresse e -mail de
l'utilisateur malveillant :
▪ Pour éviter cette vulnérabilité, nous devons inspecter chaque
demande entrante POST, PUT, PATCH ou DELETE pour une
valeur de session secrète à laquelle l'application malveillante
ne peut pas accéder.
Prévenir les requêtes
CSRF
Prévenir les requêtes CSRF
▪ Laravel génère automatiquement un jeton " token" CSRF pour
chaque session utilisateur active gérée par l'application. Ce
jeton (token) est utilisé pour vérifier que l'utilisateur
authentifié est la personne qui fait réellement les requêtes à
l'application. Étant donné que ce jeton est stocké dans la
session de l'utilisateur et change à chaque régénération de la
session, une application malveillante ne peut pas y accéder.
Prévenir les requêtes CSRF
▪ Le jeton CSRF de la session en cours est accessible via la
session de la requête ou via la fonction d'assistance
csrf_token :
use Illuminate\Http\Request;
Route::get('/token', function (Request $request) {
$token = $request->session()->token();
$token = csrf_token();
// ...
});
Prévenir les requêtes CSRF
▪ Chaque fois que vous définissez un formulaire HTML "POST",
"PUT", "PATCH" ou "DELETE" dans votre application, vous
devez inclure un champ _token CSRF caché dans le
formulaire afin que le middleware de protection CSRF puisse
valider la demande.
Prévenir les requêtes CSRF
▪ Pour plus de commodité, vous pouvez utiliser la directive
@csrf pour générer le champ de saisie du jeton caché :
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Prévenir les requêtes CSRF
▪ Le middleware App\Http\Middleware\VerifyCsrfToken , qui est
inclus dans le groupe middleware web par défaut, vérifiera
automatiquement que le jeton dans l'entrée de la requête
correspond au jeton stocké dans la session. Lorsque ces deux
jetons correspondent, nous savons que l'utilisateur authentifié
est celui qui lance la requête.
Exclure les URI de la protection CSRF
▪ Parfois, vous souhaiterez peut-être exclure un ensemble d'URI
de la protection CSRF.
▪ Par exemple, si vous utilisez Stripe pour traiter les paiements
et utilisez leur système de webhook, vous devrez exclure
votre route de gestionnaire de webhook Stripe de la
protection CSRF car Stripe ne saura pas quel jeton CSRF
envoyer à vos routes.
Exclure les URI de la protection CSRF
▪ En règle générale, vous devez placer ces types de routes en
dehors du groupe de middleware web
App\Providers\RouteServiceProvider qui s'applique à toutes les
routes du fichier routes /[Link]. Cependant, vous pouvez
également exclure les routes en ajoutant leurs URI à la
propriété $except du middleware VerifyCsrfToken :
<?php
namespace App\Http\Middleware;
Exclure les URI de la protection CSRF
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/*',
'[Link]
'[Link]
];
}