Chapitre 4 : Sécurité des applications Web
Formation : Master Sécurité Informatique – Durée : 4H
Plan
1. Problématiques spécifiques aux applications web
2. Sécurisation des formulaires et paramètres d’URL
3. Protection des données sensibles
4. Sécurité des services RESTful et SOAP
5. Content Security Policy (CSP) & protection XSS
Problématiques spécifiques aux applications web
● Interfaces directement exposées à Internet
● Multiplicité des technologies front-end / back-end
● Utilisateurs non fiables
● Risques courants :
○ Injection (SQL, command, etc.)
○ Cross-Site Scripting (XSS)
○ Cross-Site Request Forgery (CSRF)
○ Mauvaise gestion des erreurs
○ Mauvais contrôles d'accès
📌 Exemple : page de login acceptant une injection SQL
Sécurisation des formulaires
✅ Bonnes pratiques :
● Utiliser POST pour les données sensibles
● Valider côté client ET côté serveur
● Filtrer les caractères spéciaux (ex: <, >, ', ")
● Implémenter un token CSRF
📌 Exemple [Link] :
js
CopierModifier
[Link](csrf());
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Sécurisation des paramètres d’URL
⚠️ Risques :
● Modification manuelle des IDs
● Inclusion de commandes malveillantes
● Révélation d’identifiants ou tokens
✅ Solutions :
● Ne jamais exposer d’ID sensible en clair
● Valider et filtrer tous les paramètres
● Utiliser des UUID ou des tokens courts signés
📌 Mauvais exemple : /admin/delete?user=4
Protéger les données sensibles
🔐 Chiffrement et Hashing
● Hashing pour les mots de passe (bcrypt, argon2)
● Chiffrement pour les données sensibles (ex : AES-256)
● Stockage sécurisé avec rotation des clés
📌 Exemple :
js
CopierModifier
const crypto = require("crypto");
const cipher = [Link]("aes-256-cbc", key, iv);
Erreurs fréquentes
● Stocker des mots de passe en clair
● Réutiliser des clés faibles ou statiques
● Journaliser des données sensibles (tokens, passwords, CB)
✅ Astuce : Masquer ou hacher avant toute journalisation
Sécurité des services RESTful
✅ Bonnes pratiques REST :
● Utiliser HTTPS exclusivement
● Authentification via JWT ou OAuth2
● Validation stricte des payloads JSON (types, tailles, champs)
● Utiliser des codes HTTP cohérents (403 ≠ 404)
📌 Exemple d'erreur fréquente :
json
CopierModifier
{
"role": "admin"
}
(Mutation directe via l’API)
Sécurité des services SOAP
SOAP = XML basé, plus verbeux que REST
✅ Bonnes pratiques SOAP :
● Utiliser WS-Security pour signer/encrypter les messages
● Restreindre les actions via WSDL + filtrage IP
● Valider les schémas XSD
● Protection contre XML Injection et XXE (Entity Expansion)
📌 Exemple d’attaque :
xml
CopierModifier
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "[Link] ]>
Content Security Policy (CSP)
Définition : politique HTTP pour empêcher l’exécution de scripts non autorisés
✅ But :
● Prévenir les attaques XSS
● Interdire les inline scripts
● Restreindre les sources de contenu (img-src, script-src, etc.)
📌 Exemple CSP :
http
CopierModifier
Content-Security-Policy: default-src 'self'; script-src 'self'
[Link]
Cas pratique – Injection XSS
html
CopierModifier
<input name="name" value="<script>alert('XSS')</script>">
⚠️ Injection possible si pas d'encodage HTML
✅ Solution :
● Échapper toutes les variables HTML
● Utiliser un moteur de template sécurisé
Cas pratique – Mise en place d’une CSP
1. Page vulnérable à XSS
2. Déploiement d’un en-tête CSP via Express
js
CopierModifier
[Link]("Content-Security-Policy", "default-src 'self';");
3. Test via navigateur
Checklist de sécurisation Web
Composant Sécurisé
?
Formulaires HTML ✅/❌
Paramètres URL ✅/❌
API REST ✅/❌
Cookies (HttpOnly) ✅/❌
Headers HTTP ✅/❌
CSP ✅/❌
Synthèse et bonnes pratiques
✅ TOUJOURS :
● Valider & filtrer toutes les entrées
● Protéger les données sensibles par hashing/chiffrement
● Sécuriser les APIs REST/SOAP (auth + contrôle)
● Activer HTTPS, CSP, anti-CSRF
Pour aller plus loin
● OWASP Cheat Sheet Series
● Mozilla CSP Guide
● Outils : ZAP, Burp Suite, Postman, [Link]
Fiche TP – XSS, CSP et Sécurisation
REST
Public cible : Étudiants de Master – Sécurité Informatique
Durée estimée : 3h à 4h
Pré-requis :
● Notions de HTML, JavaScript, [Link]
● Connaissances de base en sécurité web (XSS, CSP, REST)
🎯 Objectifs pédagogiques
À la fin de ce TP, l'étudiant sera capable de :
● Identifier une faille XSS dans une application web
● La corriger avec des contre-mesures efficaces
● Mettre en place une Content Security Policy
● Sécuriser une API REST (validation, HTTP headers, etc.)
🧰 Environnement requis
● [Link] ≥ 18
● Éditeur de code (VS Code recommandé)
● Navigateur moderne (Firefox ou Chrome)
● Postman ou Curl
● Terminal
📁 Structure du projet
pgsql
CopierModifier
xss-csp-rest/
├── [Link]
├── public/
│ └── [Link]
├── views/
│ └── [Link]
├── routes/
│ └── [Link]
├── middleware/
│ └── [Link]
├── [Link]
└── .env
🔨 Étape 1 – Initialisation du projet
bash
CopierModifier
mkdir xss-csp-rest && cd xss-csp-rest
npm init -y
npm install express ejs helmet body-parser dotenv
🧱 Étape 2 – Serveur Express de base
[Link]
js
CopierModifier
const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const helmet = require("helmet");
const app = express();
require("dotenv").config();
[Link]("view engine", "ejs");
[Link]([Link]({ extended: true }));
[Link]([Link]([Link](__dirname, "public")));
[Link](helmet()); // sécurise les headers
// Routes
const apiRouter = require("./routes/api");
[Link]("/api", apiRouter);
// Formulaire vulnérable (XSS)
[Link]("/", (req, res) => {
[Link](__dirname + "/public/[Link]");
});
[Link]("/message", (req, res) => {
const message = [Link];
[Link]("message", { message }); // vulnérable
});
[Link](3000, () => [Link]("TP app listening on port
3000"));
📄 Étape 3 – Page HTML vulnérable
public/[Link]
html
CopierModifier
<form method="POST" action="/message">
<label>Message :</label><br>
<textarea name="message" rows="5" cols="40"></textarea><br>
<button type="submit">Envoyer</button>
</form>
🧨 Étape 4 – Vue vulnérable
views/[Link]
html
CopierModifier
<h2>Votre message :</h2>
<div><%= message %></div>
🔥 Étape 5 – Test de faille XSS
1. Lancer le serveur : node [Link]
2. Accéder à [Link]
3. Envoyer ce script :
html
CopierModifier
<script>alert('XSS')</script>
4. Observer le popup XSS injecté dans la réponse
🛡️ Étape 6 – Correction de la faille
Remplacer dans [Link] :
ejs
CopierModifier
<div><%= message %></div>
par :
ejs
CopierModifier
<div><%- [Link](/</g, "<").replace(/>/g, ">")
%></div>
ou utiliser une fonction de sanitisation plus robuste comme DOMPurify (si frontend).
📜 Étape 7 – Mise en place de CSP
Créer le middleware middleware/[Link] :
js
CopierModifier
[Link] = function(req, res, next) {
[Link]("Content-Security-Policy", "default-src 'self'");
next();
};
Dans [Link] :
js
CopierModifier
const setCSP = require("./middleware/csp");
[Link](setCSP);
🔎 Test : Réessayer l’injection <script>alert()</script>
✅ Résultat attendu : bloqué par la CSP
🔐 Étape 8 – Création d’une API REST sécurisée
routes/[Link]
js
CopierModifier
const express = require("express");
const router = [Link]();
[Link]([Link]());
// Exemple d’API POST vulnérable
[Link]("/contact", (req, res) => {
const { name, email, message } = [Link];
if (!name || !email || !message) {
return [Link](400).json({ error: "Champs manquants" });
}
// Log simulé
[Link](`[CONTACT] ${name} <${email}>: ${message}`);
[Link](200).json({ status: "Message reçu" });
});
[Link] = router;
✅ Étape 9 – Validation & protection REST
Améliorer la validation avec une vérification stricte des types :
js
CopierModifier
if (
typeof name !== "string" ||
typeof email !== "string" ||
typeof message !== "string"
) {
return [Link](400).json({ error: "Entrées invalides" });
}
Activer Helmet pour sécuriser les headers HTTP.
🎓 Étape 10 – Questions de réflexion
1. Quelles seraient les conséquences d’une XSS stockée ?
2. Pourquoi utiliser une CSP même avec des protections côté serveur ?
3. Quelle est la différence entre X-XSS-Protection et CSP ?
4. Comment un attaquant peut-il exfiltrer des données via une API vulnérable ?
📌 Livrables attendus
● Captures d’écran :
○ Faille XSS initiale
○ Protection CSP en action
○ Appels REST valides et invalides
● Code du projet avec commentaires
● Réponses aux questions de réflexion