Sécurité des applications JavaScript : top 10 des vulnérabilités pour débutants
\n\nLe développement en JavaScript, en particulier dans l'environnement Node.js, ouvre de vastes possibilités pour créer des applications web modernes. Cependant, la puissance s'accompagne de responsabilités. Ignorer les questions de sécurité peut entraîner des fuites de données, des pertes financières et des dommages à la réputation. Pour les développeurs débutants, comprendre les principales menaces est la première étape vers la création d'un code sécurisé. Dans cet article, nous analyserons le top 10 des vulnérabilités JavaScript (Node.js) basé sur la liste OWASP, avec des exemples de code et des conseils pratiques de protection.
\n\n1. Scripting inter-sites (XSS)
\nXSS est l'une des attaques les plus courantes. Un attaquant injecte un script malveillant dans une page web, qui s'exécute dans le navigateur de la victime. Dans Node.js, cela se produit souvent via une sortie de données non échappée.
\n\nExemple de code vulnérable (Express) :
\napp.get('/user/:name', (req, res) => {\n res.send('<h1>Bonjour, ' + req.params.name + '</h1>');\n});\n\n\nComment se protéger : Utilisez des moteurs de templates avec auto-échappement (par exemple, Handlebars, EJS) ou des bibliothèques comme helmet. N'insérez jamais directement la saisie utilisateur dans le HTML.
app.get('/user/:name', (req, res) => {\n const safeName = encodeURIComponent(req.params.name);\n res.send(`<h1>Bonjour, ${safeName}</h1>`);\n});\n\n\n2. Injections SQL
\nSi votre application utilise une base de données SQL (par exemple, PostgreSQL ou MySQL), un mauvais traitement des requêtes peut entraîner l'exécution de code SQL arbitraire.
\n\nCode vulnérable :
\nconst query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n\n\nSolution : Utilisez toujours des requêtes paramétrées ou un ORM (par exemple, Sequelize, Prisma).
\n\nconst query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n\n\n3. Falsification de requête inter-sites (CSRF)
\nUne attaque CSRF force un utilisateur à effectuer une action non désirée sur un site où il est authentifié. Par exemple, transférer de l'argent ou modifier un mot de passe.
\n\nProtection : Utilisez des jetons CSRF. Dans Express, la bibliothèque csurf est populaire (obsolète, mais remplacée par csrf-csrf ou les solutions intégrées des frameworks).
const csrf = require('csrf-csrf');\nconst { generateToken } = csrf();\n\napp.post('/transfer', (req, res) => {\n const token = req.body._csrf;\n if (!validateToken(token)) {\n return res.status(403).send('Attaque CSRF');\n }\n // Exécution du transfert\n});\n\n\n4. Dépendances non sécurisées
\nLes applications Node.js utilisent des milliers de paquets npm. Les dépendances obsolètes ou vulnérables sont une cause fréquente de piratages.
\n\nRecommandations :
\n- \n
- Exécutez régulièrement
npm auditpour vérifier les vulnérabilités. \n - Utilisez
snykouDependabotpour les mises à jour automatiques. \n - Supprimez les paquets inutilisés. \n
5. Authentification et gestion de sessions non sécurisées
\nDes mots de passe faibles, l'absence de limitation du nombre de tentatives de connexion, un mauvais stockage des jetons de session — tout cela conduit à la compromission des comptes.
\n\nBonnes pratiques :
\n- \n
- Stockez les mots de passe sous forme hachée (bcrypt, argon2). \n
- Utilisez des JWT avec une durée de vie courte et des refresh tokens. \n
- Limitez les tentatives de connexion (rate limiting). \n
const bcrypt = require('bcrypt');\nconst saltRounds = 10;\n\n// Inscription\nconst hash = await bcrypt.hash(password, saltRounds);\n\n// Connexion\nconst match = await bcrypt.compare(inputPassword, hash);\n\n\n6. Défauts de contrôle d'accès
\nUtil