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

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



Les applications JavaScript modernes sur Node.js traitent d'énormes volumes de données sensibles, ce qui en fait une cible attrayante pour les attaquants. Selon OWASP, la plupart des piratages sont dus à des erreurs typiques qui peuvent être évitées. Dans cet article, nous allons analyser les 10 vulnérabilités les plus courantes, fournir des exemples de code réels et montrer comment protéger votre application.



1. XSS (Cross-Site Scripting)

Le cross-site scripting est l'une des menaces les plus anciennes, mais toujours d'actualité. L'attaquant injecte un script malveillant dans une page web, qui s'exécute dans le navigateur de la victime.



// Code vulnérableapp.get('/search', (req, res) => {    const query = req.query.q;    res.send(`<h2>Résultats de recherche pour : ${query}</h2>`);});

// Version sécuriséeconst escapeHtml = (str) => { return str.replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/"/g, '&quot;') .replace(/'/g, '&#039;');};

app.get('/search', (req, res) => { const query = escapeHtml(req.query.q || ''); res.send(`<h2>Résultats de recherche pour : ${query}</h2>`);});


2. SQL Injection

L'injection de code SQL se produit lorsque l'entrée utilisateur est directement concaténée dans une requête SQL. Cela peut entraîner une fuite ou une suppression de données.



// Code vulnérableconst userId = req.body.id;const query = `SELECT * FROM users WHERE id = ${userId}`;

// Version sécurisée avec requêtes paramétréesconst userId = req.body.id;const query = 'SELECT * FROM users WHERE id = ?';db.query(query, [userId], (err, results) => { // traitement des résultats});


3. Désérialisation non sécurisée

Node.js utilise souvent JSON.parse(), mais si vous travaillez avec d'autres formats (par exemple, Buffer), un attaquant peut injecter des données malveillantes.



// Approche dangereuseconst data = JSON.parse(req.body.data); // peut contenir __proto__

// Approche sécuriséeconst safeParse = (json) => { const data = JSON.parse(json); // Supprimer récursivement les propriétés dangereuses return JSON.parse(JSON.stringify(data));};


4. CSRF (Cross-Site Request Forgery)

Attaque où l'attaquant force un utilisateur à effectuer une action non désirée sur un site où il est authentifié.



// Installation de la protection avec csurfconst csrf = require('csurf');const csrfProtection = csrf({ cookie: true });

app.post('/transfer', csrfProtection, (req, res) => { // traitement sécurisé du transfert});


5. Authentification non sécurisée

Mots de passe faibles, absence de limitation des tentatives de connexion et stockage des mots de passe en clair sont des problèmes fréquents.



// Hachage correct des mots de passeconst bcrypt = require('bcrypt');

async function createUser(password) { const salt = await bcrypt.genSalt(12); const hash = await bcrypt.hash(password, salt); // enregistrer le hash dans la BDD}

async function checkPassword(plainPassword, hash) { return await bcrypt.compare(plainPassword, hash);}


6. Fuite de données confidentielles

Envoyer la pile d'erreurs au client ou journaliser les mots de passe est une erreur fréquente des développeurs.



// Incorrectapp.use((err, req, res, next) => {    res.status(500).json({ error: err.stack });});

// Correctapp.use((err, req, res, next) => { console.error(err); // journaliser sur le serveur res.status(500).json({ error: 'Erreur interne du serveur' });});


7. Configuration non sécurisée

Utilisation de ports standard, mode débogage activé en production et politiques CORS faibles.



// Configuration CORS sécuriséeconst cors = require('cors');cons                

Blogs

Book Recommendations