Back-end · 4 mondes · 12 étapes

Auth & sécurité

Mots de passe, jetons signés, failles du web et autorisation, écrits de ses mains.

Progression

0 %

0/12 étapes terminées

Intermédiaire · 10 min de lecture

Les injections

Quand une donnée est interprétée comme du code

1Définition

Une injection survient quand une donnée fournie par l'utilisateur est insérée dans un langage interprété — HTML (XSS), SQL, commande système, chemin de fichier — sans être neutralisée. La donnée franchit la frontière entre texte et instructions.

2Principes fondamentaux

01

Séparer données et instructions

Requêtes paramétrées pour SQL, textContent pour le DOM, tableaux d'arguments pour les commandes.

02

Échapper selon le contexte

L'échappement HTML ne protège pas du SQL, et réciproquement : chaque langage a le sien.

03

Listes blanches

Pour une redirection, un nom de fichier, un tri : accepter seulement des valeurs connues.

04

Défense en profondeur

Une Content-Security-Policy limite les dégâts d'un XSS qui aurait échappé au reste.

3Exemples pratiques

Trois injections, trois parades

Exemple
1// HTML : textContent plutôt qu'innerHTML2element.textContent = pseudo;3 4// SQL : paramètres, jamais de concaténation5db.query("SELECT * FROM joueurs WHERE pseudo = $1", [pseudo]);6 7// Fichiers : liste blanche de noms8if (!/^[A-Za-z0-9._-]+$/.test(nom) || nom.includes("..")) refuser();

Même principe à chaque fois : la donnée reste une donnée, quel que soit son contenu.

Une Content-Security-Policy

Exemple
1Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'

Même si un script est injecté, le navigateur refuse de l'exécuter s'il ne vient pas du site lui-même.

4Erreurs courantes

innerHTML avec une donnée

À éviter

liste.innerHTML += "<li>" + pseudo + "</li>";

À faire

const li = document.createElement("li"); li.textContent = pseudo; liste.append(li);

Pourquoi : Le pseudo devient du HTML exécutable.

Concaténer du SQL

À éviter

`SELECT * FROM joueurs WHERE pseudo = '${pseudo}'`

À faire

requête paramétrée

Pourquoi : ' OR '1'='1 ouvre toute la table.

Suivre une redirection fournie

À éviter

return Response.redirect(url.searchParams.get("retour"));

À faire

vérifier que la destination est un chemin interne

Pourquoi : Le site devient un relais d'hameçonnage.

5Subtilités à connaître

  • ◆Les attributs d'événement (onerror, onclick) et les URL javascript: sont des vecteurs de XSS aussi dangereux que <script>.
  • ◆Un contenu Markdown converti en HTML doit être assaini (DOMPurify) : le Markdown autorise le HTML brut.
  • ◆Les modèles d'IA ont leur propre injection : des instructions cachées dans un texte que le modèle lit (injection de prompt).

6Vérifie ta compréhension

Question 1/3

Score 0

Afficher un pseudo sans risque dans le DOM :

Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.