{
  "id": "sql-injection-prevention-n2",
  "code": "PS-0049",
  "titre": "Prévention de l'injection SQL dans le code généré",
  "resume": "Configure le modèle pour générer systématiquement du code SQL sécurisé avec requêtes paramétrées, et pour signaler les patterns d'injection SQL dans le code soumis.",
  "type_ia": "dev-autonome",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N2",
  "owasp": [
    "LLM05"
  ],
  "tags": [
    "sql-injection",
    "code-securise",
    "developpement",
    "owasp"
  ],
  "prompt_fr": "Pour tout code SQL généré ou revu, applique systématiquement les règles de sécurité ci-dessous.\n\n**Règles de génération sécurisée**\n1. Utilise toujours des requêtes paramétrées ou des prepared statements — jamais de concaténation de chaînes.\n2. Signale explicitement si le code soumis contient des concaténations SQL directes.\n3. Pour les ORM : utilise les méthodes de l'ORM (`.where()`, `.filter()`) — pas de SQL brut avec interpolation.\n4. Si un utilisateur demande du SQL avec interpolation directe : fournis la version sécurisée et explique le risque.\n\n**Exemple systématique**\n```javascript\n// ❌ Vulnérable\nconst q = `SELECT * FROM users WHERE id = ${userId}`;\n\n// ✅ Sécurisé\nconst q = `SELECT * FROM users WHERE id = ?`; // params: [userId]\n```\n\n**Livrables à produire**\n- **Code généré conforme** : toute requête est paramétrée + commentaire `// SECURITY: parameterized query`.\n- **Bloc d'avertissement** en revue de code : « ⚠️ Injection SQL possible ligne N : concaténation directe avec `<variable>`. Version paramétrée : `<code>`. »\n- **Événement CI/CD** (JSON-line) :\n  `[SQL_INJECTION_RISK] {\"ts\":\"<ISO8601>\",\"file\":\"<chemin>\",\"line\":<n>,\"pattern\":\"<concat|template-literal|format|f-string|other>\",\"severity\":\"<low|medium|high>\"}`",
  "prompt_en": "For all SQL code generated or reviewed, systematically apply the security rules below.\n\n**Secure generation rules**\n1. Always use parameterized queries or prepared statements — never string concatenation.\n2. Explicitly flag if submitted code contains direct SQL concatenation.\n3. For ORMs: use ORM methods (`.where()`, `.filter()`) — no raw SQL with interpolation.\n4. If a user requests SQL with direct interpolation: provide the secure version and explain the risk.\n\n**Systematic example**\n```javascript\n// ❌ Vulnerable\nconst q = `SELECT * FROM users WHERE id = ${userId}`;\n\n// ✅ Secure\nconst q = `SELECT * FROM users WHERE id = ?`; // params: [userId]\n```\n\n**Deliverables to produce**\n- **Compliant generated code**: every query is parameterized + comment `// SECURITY: parameterized query`.\n- **Warning block** in code review: \"⚠️ Possible SQL injection at line N: direct concatenation with `<variable>`. Parameterized version: `<code>`.\"\n- **CI/CD event** (JSON-line):\n  `[SQL_INJECTION_RISK] {\"ts\":\"<ISO8601>\",\"file\":\"<path>\",\"line\":<n>,\"pattern\":\"<concat|template-literal|format|f-string|other>\",\"severity\":\"<low|medium|high>\"}`",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "tous"
  ],
  "source": {
    "auteur": "Mistral AI",
    "organisation": "Mistral AI",
    "url": "https://docs.mistral.ai/guides/guardrailing/",
    "type": "officielle"
  },
  "cumulable_avec": [
    "code-review-security-n2",
    "output-validation-before-display-n1"
  ],
  "explication": "La documentation Mistral AI Guardrailing pour les assistants de code recommande des règles de génération sécurisée pour les patterns les plus courants. L'injection SQL reste la vulnérabilité #1 OWASP Web Application Security Top 10 la plus fréquente dans le code généré par IA.\n\n**Quand l'utiliser :** assistants de développement, copilotes de code, tout LLM générant du code interagissant avec des bases de données.\n\n**Ce qu'il protège :** LLM05 — prévention de génération de code vulnérable. Réduit le risque d'injection SQL dans les applications générées par IA. N2 : à combiner avec PS-0027 (code review sécurité). Le `[SQL_INJECTION_RISK]` permet à un pipeline CI de **bloquer un merge** quand une concaténation SQL non documentée est détectée.",
  "installation": {
    "ou_quand": "À installer dans la config de l'assistant de développement backend. Profil personnel (dev) ou config projet (équipe) — couverture maximale en l'activant aux deux niveaux.",
    "moments": [
      "profil",
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "Claude Code (backend)",
        "instruction": "`~/.claude/CLAUDE.md` (global) ou `./CLAUDE.md` (projet). Doubler avec Snyk Code ou Semgrep en CI pour la garantie déterministe."
      },
      {
        "contexte": "GitHub Copilot Chat / Cursor",
        "instruction": "**Custom Instructions** ou `.cursorrules`. Combiner avec un linter (Bandit pour Python, SQL-injection lint pour JS/TS)."
      },
      {
        "contexte": "ChatGPT (Custom GPT « Backend Reviewer »)",
        "instruction": "**Custom GPT → Instructions**. Indiquer aux développeurs backend d'utiliser ce GPT pour toute génération de requêtes BD."
      },
      {
        "contexte": "API en CI/CD (PR review automatique)",
        "instruction": "Paramètre **`system`** + parser `[SQL_INJECTION_RISK]` → bloquer le merge sur severity high. Combiner avec un outil SAST (Snyk, SonarQube)."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-22",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 250,
    "sortie": null
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-22",
      "version": "1.1",
      "summary": "Mise à jour éditoriale"
    }
  ]
}
