Sécurité JavaScript : Protection contre les injections SQL et les XSS — Guide complet pour le développeur
\n\nVous êtes-vous déjà demandé pourquoi les pirates aiment tant les applications web ? La réponse est simple : les développeurs laissent souvent les « portes » ouvertes. Les deux failles les plus courantes sont les injections SQL et les XSS (cross-site scripting). Même si vous codez en JavaScript, cela ne signifie pas que vous êtes à l'abri des attaques côté serveur. Dans cet article, nous allons voir comment reconnaître les vulnérabilités et, surtout, comment les corriger en utilisant les pratiques de sécurité modernes.
\n\nPourquoi un développeur JavaScript doit-il penser à la sécurité ?
\nBeaucoup de débutants pensent : « Je code côté frontend, je ne touche pas aux bases de données — je ne risque rien. » C'est une idée fausse et dangereuse. Aujourd'hui, JavaScript fonctionne partout : côté client (navigateur), côté serveur (Node.js) et même dans les bases de données (MongoDB). Par conséquent, la responsabilité de la sécurité vous incombe. Les injections SQL et les XSS ne sont pas de simples termes ennuyeux de manuels, ce sont des menaces réelles qui peuvent détruire votre projet, voler les données des utilisateurs ou transformer votre site en foyer de virus.
\n\nInjections SQL : Une menace invisible pour votre base de données
\nUne injection SQL est une attaque par laquelle un attaquant « injecte » du code SQL malveillant via des champs de saisie (formulaires, URL, en-têtes). Si vous utilisez Node.js avec PostgreSQL, MySQL ou toute autre base de données relationnelle, vous êtes en zone de risque.
\n\nÀ quoi ressemble une injection SQL en JavaScript ?
\nImaginez que vous ayez un formulaire de connexion et que vous écriviez la requête comme ceci :
\n// ❌ DANGEREUX : vulnérabilité aux injections SQL\nconst username = req.body.username;\nconst password = req.body.password;\nconst query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;\nImaginez maintenant que l'attaquant saisisse dans le champ username : admin' --. La requête devient :
SELECT * FROM users WHERE username = 'admin' --' AND password = '';\n-- est un commentaire en SQL. Tout ce qui suit est ignoré. Le pirate se connecte en tant qu'admin sans mot de passe. Et s'il saisit '; DROP TABLE users; -- ? Vous perdrez toute la table des utilisateurs.
Protection : requêtes paramétrées (prepared statements)
\nLa meilleure façon de se protéger contre les injections SQL est de ne jamais insérer les données utilisateur directement dans la chaîne de requête. Utilisez des requêtes paramétrées. Voici comment faire dans Node.js avec la bibliothèque pg (PostgreSQL) :
// ✅ SÉCURISÉ : requête paramétrée\nconst { Pool } = require('pg');\nconst pool = new Pool();\n\napp.post('/login', async (req, res) => {\n const { username, password } = req.body;\n \n // Les signes $1 et $2 sont des espaces réservés\n const query = 'SELECT * FROM users WHERE username = $1 AND password = $2';\n const values = [username, password];\n \n try {\n const result = await pool.query(query, values);\n // traitement du résultat...\n } catch (error) {\n console.error('Erreur de requête :', error);\n }\n});\nLa bibliothèque échappe elle-même les valeurs. Même si l'attaquant transmet admin' --, cela sera interprété comme une simple chaîne de caractères, et non comme une commande SQL.
Mesures de protection supplémentaires
\n- \n
- Validation côté serveur : vérifiez le type et la longueur des données d'entrée. Si un email est attendu, assurez-vous qu'il s'agit bien d'un email. \n
- Principe du moindre privilège : n'utilisez pas l'utilisateur root de la base de données dans l'application. Créez un utilisateur distinct avec des droits uniquement sur les tables nécessaires. \n
- Bibliothèques ORM : utilisez Prisma, Sequelize ou TypeORM. Elles automatisent la paramétrisation, mais n'oubliez pas que vous pouvez toujours écrire du code non sécurisé avec elles (par exemple, en utilisant
sequelize.queryavec concaténation). \n
XSS (Cross-Site Scripting) : Quand votre site s'attaque lui-même
\nLe XSS est une attaque par laquelle un attaquant injecte du code JavaScript malveillant sur une page, qui