Chapitre 22 – Sécurité JavaScript
La sécurité est une composante essentielle du développement web. Mal utilisée, JavaScript peut introduire des failles graves dans une application, notamment des attaques XSS ou des injections de code. Ce chapitre explore les principaux risques et les bonnes pratiques pour s'en prémunir.
Démonstration des vulnérabilités de sécurité
1. XSS (Cross-Site Scripting)
Le Cross-Site Scripting (XSS) consiste à injecter du code JavaScript malveillant dans une page web vue par d'autres utilisateurs.
Exemple d'injection XSS
<input value="<script>alert('XSS')</script>" />
Si ce contenu est réinjecté dans la page sans vérification, le script est exécuté.
Types de XSS
- Reflected XSS : l'injection se fait via une URL ou une requête et est immédiatement reflétée.
- Stored XSS : le code malveillant est stocké sur le serveur (ex : dans une base de données).
- DOM-based XSS : l'injection est exploitée directement via les manipulations DOM côté client.
Attention aux risques XSS
Les attaques XSS peuvent voler des cookies de session, modifier le contenu de la page ou rediriger l'utilisateur vers des sites malveillants.
2. Injections de code
Les injections ne se limitent pas au XSS. Par exemple, exécuter du code dynamique avec eval() est très risqué :
// Mauvaise pratique dangereuse
let userInput = "alert('Hacked!')";
eval(userInput);
Ne jamais exécuter de code reçu d'un utilisateur sans validation stricte.
3. Bonnes pratiques de sécurité
- Ne jamais insérer directement du contenu utilisateur dans le HTML sans l'échapper.
- Utiliser textContent au lieu de innerHTML autant que possible.
- Éviter les fonctions dynamiques comme
eval(),Function()ousetTimeout()avec des chaînes de texte. - Mettre en place des en-têtes HTTP de sécurité (ex:
Content-Security-Policy). - Utiliser des frameworks modernes qui gèrent l'échappement (React, Vue...)
Exemple sécurisé
// Sécurisé : insérer du texte sans danger
const div = document.createElement('div');
div.textContent = userInput;
// Alternative moderne avec sanitization
const safeHTML = DOMPurify.sanitize(userInput);
element.innerHTML = safeHTML;
Conseil de sécurité
Utilisez la bibliothèque DOMPurify pour nettoyer le HTML avant de l'insérer dans le DOM.
Résumé du chapitre
- Les attaques XSS sont des injections de code malveillant dans les pages web.
- Les injections de code comme
eval()peuvent être dangereuses si mal utilisées. - Évitez l'usage de
innerHTMLavec des données non sûres. - Adoptez des fonctions sécurisées comme
textContentpour manipuler le DOM. - Respectez les bonnes pratiques et utilisez des outils/frameworks modernes pour renforcer la sécurité.
La sécurité doit être pensée dès le départ et non ajoutée après coup. Protéger vos utilisateurs, c'est protéger votre application.