Sécurité des applications JavaScript : top 10 des vulnérabilités pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sécurité des applications JavaScript : top 10 des vulnérabilités pour débutants

\n\n

Le 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\n

1. Scripting inter-sites (XSS)

\n

XSS 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\n

Exemple de code vulnérable (Express) :

\n
app.get('/user/:name', (req, res) => {\n  res.send('<h1>Bonjour, ' + req.params.name + '</h1>');\n});\n
\n\n

Comment 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.

\n\n
app.get('/user/:name', (req, res) => {\n  const safeName = encodeURIComponent(req.params.name);\n  res.send(`<h1>Bonjour, ${safeName}</h1>`);\n});\n
\n\n

2. Injections SQL

\n

Si 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\n

Code vulnérable :

\n
const query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n
\n\n

Solution : Utilisez toujours des requêtes paramétrées ou un ORM (par exemple, Sequelize, Prisma).

\n\n
const query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n
\n\n

3. Falsification de requête inter-sites (CSRF)

\n

Une 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\n

Protection : 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).

\n\n
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\n

4. Dépendances non sécurisées

\n

Les 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\n

Recommandations :

\n
    \n
  • Exécutez régulièrement npm audit pour vérifier les vulnérabilités.
  • \n
  • Utilisez snyk ou Dependabot pour les mises à jour automatiques.
  • \n
  • Supprimez les paquets inutilisés.
  • \n
\n\n

5. Authentification et gestion de sessions non sécurisées

\n

Des 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\n

Bonnes 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
\n\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\n

6. Défauts de contrôle d'accès

\n

Util

Blogs

Book Recommendations