Sécurité des applications JavaScript : top 10 des vulnérabilités en pratique

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

Introduction : pourquoi la sécurité des applications JavaScript n'est pas une option, mais une nécessité

JavaScript (notamment sur la plateforme Node.js) est devenu le langage dominant pour créer des applications côté client et côté serveur. Cependant, avec l'essor de sa popularité, le nombre d'attaques augmente également. Selon l'OWASP, la plupart des intrusions sont dues à des erreurs typiques qui peuvent être évitées. Dans cet article, nous allons analyser le top 10 des vulnérabilités JavaScript (Node.js) avec des exemples de code réels et des méthodes de protection. Ce contenu sera utile aussi bien aux développeurs débutants qu'aux développeurs expérimentés souhaitant renforcer la sécurité de leurs projets.



1. Injections (SQL, NoSQL, Injection de commandes)

Les injections restent la catégorie de vulnérabilités la plus dangereuse. Dans Node.js, MongoDB et PostgreSQL sont souvent touchés.



Exemple de code vulnérable (injection NoSQL) :

// Code vulnérableapp.post('/login', async (req, res) => {  const { username, password } = req.body;  const user = await db.collection('users').findOne({    username: username,    password: password  });  // Si on transmet { "username": { "$ne": null }, "password": { "$ne": null } }, le premier utilisateur sera retourné});


Comment corriger :

  • Utilisez un ORM/ODM avec paramétrage (Mongoose, Sequelize).
  • Validez et assainissez les données d'entrée (bibliothèque validator ou joi).
  • Pour les commandes, utilisez execFile au lieu de exec.


2. Scripting inter-sites (XSS)

Le XSS permet à un attaquant d'injecter un script malveillant dans une page consultée par d'autres utilisateurs.



Exemple de code vulnérable (XSS réfléchi) :

// Route Express vulnérableapp.get('/search', (req, res) => {  const query = req.query.q;  res.send(`<h1>Résultats de recherche pour : ${query}</h1>`);  // Si on transmet ?q=<script>alert('XSS')</script>, le script s'exécutera});


Protection :

  • Échappez la sortie : utilisez res.render avec des moteurs de templates (EJS, Pug) ou encodeURIComponent.
  • Définissez l'en-tête HTTP Content-Security-Policy.
  • N'utilisez pas innerHTML côté client — préférez textContent.


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

Une authentification faible est l'une des principales causes de fuites de données. Les développeurs codent souvent en dur des clés ou utilisent des mots de passe faibles.



Erreurs typiques :

  • Stockage des mots de passe en clair (au lieu de bcrypt/argon2).
  • Utilisation de secrets JWT prévisibles (secret123).
  • Absence de limitation du nombre de tentatives de connexion.


Exemple d'implémentation correcte :

const bcrypt = require('bcrypt');const saltRounds = 12;

app.post('/register', async (req, res) => { const hash = await bcrypt.hash(req.body.password, saltRounds); // Enregistrer le hash dans la BDD});

app.post('/login', async (req, res) => { const user = await db.getUser(req.body.username); const match = await bcrypt.compare(req.body.password, user.passwordHash); if (match) { // Créer un JWT avec une durée de validité courte const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '15m' }); res.json({ token }); }});


4. SSRF (Server-Side Request Forgery)

La vulnérabilité SSRF permet à un attaquant de forcer le serveur à effectuer des requêtes vers des ressources internes (par exemple, vers les métadonnées du fournisseur cloud).



Exemple :

// Code vulnérable : téléchargement d'avatar par URLapp.post('/avatar', async (req, res) => {  const { url } = req.body;  const response = await fetch(url); // On peut transmettre http://169.254.169.254/latest/meta-data/  // Traitement de la réponse});


Protection :

  • Créez une liste blanche des domaines autorisés.
  • Bloquez les adresses IP privées et internes.
  • Validez et normalisez l'URL avant de l'utiliser.

Blogs

Book Recommendations