4.9 KiB
TP6 : Renforcer la Sécurité des Applications Symfony
Objectifs :
Les objectifs de ce TP sont :
- Renforcer la sécurité d'un projet Symfony existant en mettant en place des mesures contre les menaces courantes
de sécurité web, telles que :
- le Cross-Site Scripting (XSS),
- le Cross-Site Request Forgery (CSRF),
- en permettant l'inscription sécurisée des utilisateurs, leur connexion et déconnexion,
- et en implémentant l'autorisation des utilisateurs en fonction des rôles.
Prérequis :
- Un projet Symfony fonctionnel (votre projet
TweetTok
, votre projet Symfony, une SAE).
Ressources
Partie 1 : Protection contre les attaques XSS
- Utilisez l'un de vos formulaire (ajout d'un
Twok
) pour tester un exploit de faille XSS (écrivez le code en JS). Que constatez-vous ?- Indice : Utilisez la balise
<script>
et la fonctionalert
en Javascript.
- Indice : Utilisez la balise
- Modifiez le template Twig et ajoutez le filtre
raw
lorsque vous affichez la variable dans laquelle vous stockez votre exploit XSS (ex :{{ commentaire|raw }}
). Retestez l'attaque, que constatez-vous ? - Utilisez le composant
html-sanitizer
de Symfony pour permettre d'afficher du code (ex : un commentaire en rouge) mais sans permettre les failles XSS. Créez un formulaire simple pour tester les vulnérabilités XSS ou modifiez un formulaire existant.
Partie 2 : Prévention des attaques CSRF
- Vérifiez si la protection contre les CSRF est activée dans vos formulaires. Comment avez-vous fait ? Si elle est activée, désactivez-la.
- Testez un exploit d'attaque CSRF sur l'un de vos formulaires.
- Indice : Implémentez un formulaire dans une page HTML externe au projet,
qui fait une requête POST vers votre site cite de l'attaque. Utilisez les
fonction Javascript
getElementById
etsubmit
pour forcer le browser à envoyer la requête sans le consentement de l'utilisateur. Si vous êtes machiavélique, trouvez une façon de ne pas afficher le formulaire sur la page.
- Indice : Implémentez un formulaire dans une page HTML externe au projet,
qui fait une requête POST vers votre site cite de l'attaque. Utilisez les
fonction Javascript
- Activez la protection CSRF dans les formulaires. Que constatez-vous ? Retestez votre attaque.
- Utilisez la commande
curl
pour envoyer une requête POST sur votre formulaire avec et sans le token CSRF, que constatez-vous ?
Partie 3 : Inscription sécurisée des utilisateurs
-
Générez une entité
User
qui sera identifié avec son email et qui aura un mot de passe, avec la commande :symfony console make:user
-
Générez un formulaire de login et logout pour l'entité
User
avec la commande suivante :symfony console make:security:form-login
-
Générez un formulaire d'inscription pour votre entité
User
avec la commande suivante :symfony console make:registration-form
N'envoyez pas de mail de confirmation.
-
Utilisez des contraintes sur votre entité
User
pour vous assurer que :- Le mot de passe est fort : https://symfony.com/doc/current/reference/constraints/PasswordStrength.html
- Le mot de passe est plus long que 8 charactères (contrainte sur la longueur)
Testez votre formulaire pour valider que ces contraintes sont bien implémentées.
-
Vers quelle route votre site redirige l'utilisateur losqu'il se connecte et se déconnecte ?
Partie 4 : Autorisation des utilisateurs avec des rôles
-
Notez que l'entité
User
a une propriétérole
qui contient le rôle de l'utilisateur (administrateur, utilisteur, etc). Quelle est la valeur par défaut ? -
Nous allons créer un utilisateur normal et un administrateur pour tester nos permissions. Exécutez la commande suivante et créez le CRUD de l'entité
User
:symfony console make:crud
Modifiez le fichier
src/Form/UserType.php
crée par la commande précédente et remplacez->add('roles')
par->add('roles', ChoiceType::class, [ 'choices' => [ 'ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_USER' => 'ROLE_USER', ], 'multiple' => true, ])
-
Utilisez le formulaire d'inscription pour inscrire au moins deux utilisateurs et utilisez le formulaire de modification nouvellement crée pour modifier le rôle d'un utilisateur en administrateur.
-
Restreignez l'accès aux routes en fonction des rôles des utilisateurs dans votre configuration de sécurité à l'aide du fichier
confi/packages/security.yaml
puis dans les fichiers des controlleurs (avec la primitiveIsGranted
) afin de restreindre les URL commençant par/user
aux seuls administrateurs (le CRUD de modification des utilisateurs). -
Essayer d'acceder aux URL
/user
et au reste de votre site sans être authentifié, en étant authentifié en tant qu'utilisateur et enfin en tant qu'administrateur afin de valider que votre configuration est correcte.