Ce bundle Symfony fournit une protection contre la falsification de requêtes intersites (CSRF ou XSRF) pour les applications côté client demandant des points de terminaison fournis par Symfony via XHR.
Fortement influencé et inspiré par DunglasAngularCsrfBundle
Pour stocker le jeton CSRF côté client, un cookie contenant le jeton peut être défini par un ou plusieurs itinéraires prédéterminés. Le bundle est préconfiguré de manière à ce que les clients http modernes côté client tels qu'Axios récupèrent automatiquement ledit cookie. Lors des requêtes ultérieures adressées à Symfony, le jeton CSRF peut ensuite être ajouté à l'en-tête HTTP pour être validé côté serveur. Encore une fois, certains clients peuvent déjà le faire automatiquement, par exemple Axios.
Utilisez Composer pour installer ce bundle :
composer require dneustadt/csrf-cookie-bundle
# config/packages/dneustadt_csrf_cookie.yaml
dneustadt_csrf_cookie :
# Generally enable/disable the CSRF protection
enable : true
# ID used to generate token
id : csrf
# Name of the cookie the token is stored in
name : XSRF-TOKEN
# Cookie expiration
expire : 0
# Cookie path
path : /
# Cookie domain
domain : null
# Cookie HttpOnly
httpOnly : true
# Cookie secure
secure : false
# Name of the HTTP header the token is expected to be stored in
header : X-XSRF-TOKEN
# Cookie same site policy
sameSite : lax Les routes peuvent être configurées pour fournir ( create ) un jeton, être sécurisées par ( require ) un jeton ou les deux.
Étant donné que les valeurs par défaut d'une seule route ou d'une collection de routes sont utilisées pour configurer le comportement, il est possible de le faire soit au moyen de fichiers de configuration, soit d'annotations.
# config/routes.yaml
api_controllers :
resource : ../src/Controller/Api
type : annotation
defaults :
csrf :
# bool or array of allowed methods
create : true
# bool or array of allowed methods
require :
- ' POST '
- ' PUT '
- ' PATCH '
- ' DELETE '
# array of route names to be excluded from create/require in this collection
exclude :
- ' app_api_blog_index '
# additional condition using ExpressionLanguage syntax
condition : ' request.isXmlHttpRequest() 'Pour plus d'informations sur les conditions, voir ExpressionLanguage
En guise d'annotation :
// src/Controller/Api/ExampleController.php
namespace App Controller Api ;
// ...
class ExampleController extends AbstractController
{
/**
* @Route("/api/index", methods={"GET","HEAD"}, defaults={"csrf": {"create": true}})
*/
public function index ()
{
// ...
}
}La protection CSRF intégrée des formulaires sera automatiquement désactivée pour les itinéraires configurés pour être sécurisés au moyen du jeton stocké dans l'en-tête HTTP, à condition que ledit jeton puisse être validé avec succès.