{
  "id": "error-handling-security-n1",
  "code": "PS-0052",
  "titre": "Gestion d'erreurs sécurisée — ne pas exposer d'informations sensibles",
  "resume": "Configure le modèle pour générer une gestion d'erreurs qui ne révèle pas d'informations sensibles (stack traces, chemins système, détails de base de données) aux utilisateurs finaux.",
  "type_ia": "dev-autonome",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N1",
  "owasp": [
    "LLM05"
  ],
  "tags": [
    "gestion-erreurs",
    "stack-trace",
    "code-securise",
    "basique"
  ],
  "prompt_fr": "Dans tout code de gestion d'erreurs généré, applique les règles de sécurité ci-dessous.\n\n**Règles de sécurité**\n1. **Message utilisateur** : Message générique ne révélant aucune information technique.\n2. **Logging interne** : Détails complets (stack trace, contexte) loggués côté serveur uniquement.\n3. **Codes d'erreur** : Utilise des codes d'erreur opaques — pas de messages révélant la structure interne.\n\n**Exemple**\n```javascript\n// ❌ Dangereux\ncatch (e) { res.send(e.message) }\n\n// ✅ Sécurisé\ncatch (e) {\n  logger.error('DB query failed', { error: e, userId, correlationId });\n  res.status(500).json({ error: 'Une erreur est survenue', code: 'ERR_500', correlationId });\n}\n```\n\nNe génère **jamais** de gestion d'erreurs qui expose des stack traces, des chemins de fichiers ou des requêtes SQL en production.\n\n**Livrables à produire**\n- **Code conforme** : tout bloc `catch` (ou équivalent) généré sépare strictement `logger.<level>()` (interne, détaillé) et `response/return` (externe, opaque).\n- **Bloc README à proposer** au moment de la première génération d'un projet :\n  ```\n  ## Politique de gestion d'erreurs\n  - Pas de stack trace en réponse HTTP\n  - Codes d'erreur opaques (ERR_XXX)\n  - correlationId systématique pour le support\n  - Logs détaillés en interne uniquement (SIEM-ready)\n  ```\n- **Avertissement explicite** si l'utilisateur insiste pour un comportement non sécurisé : « Cette demande génère une exposition d'information technique en production. Voulez-vous vraiment garder ? ».",
  "prompt_en": "In all generated error handling code, apply the security rules below.\n\n**Security rules**\n1. **User message**: Generic message revealing no technical information.\n2. **Internal logging**: Complete details (stack trace, context) logged server-side only.\n3. **Error codes**: Use opaque error codes — no messages revealing internal structure.\n\n**Example**\n```javascript\n// ❌ Dangerous\ncatch (e) { res.send(e.message) }\n\n// ✅ Secure\ncatch (e) {\n  logger.error('DB query failed', { error: e, userId, correlationId });\n  res.status(500).json({ error: 'An error occurred', code: 'ERR_500', correlationId });\n}\n```\n\nNever generate error handling that exposes stack traces, file paths or SQL queries in production.\n\n**Deliverables to produce**\n- **Compliant code**: every `catch` block (or equivalent) generated strictly separates `logger.<level>()` (internal, detailed) from `response/return` (external, opaque).\n- **README block to suggest** on first project generation:\n  ```\n  ## Error handling policy\n  - No stack trace in HTTP response\n  - Opaque error codes (ERR_XXX)\n  - Systematic correlationId for support\n  - Detailed logs internal only (SIEM-ready)\n  ```\n- **Explicit warning** if the user insists on an unsafe behavior: \"This request generates technical information exposure in production. Are you sure you want to keep?\"",
  "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 pour assistants de code recommande la gestion d'erreurs sécurisée comme pratique de base. L'exposition d'informations d'erreur est classée OWASP A05:2021 (Security Misconfiguration) et fréquemment produite par défaut par les LLM de code.\n\n**Quand l'utiliser :** tout LLM générant du code serveur ou des APIs.\n\n**Ce qu'il protège :** LLM05 — prévention de la génération de code révélant des informations sensibles dans les erreurs. N1 : applicable immédiatement, concerne tous les langages. Le `correlationId` recommandé permet de relier un ticket support à un log SIEM sans exposer la stack trace au client.",
  "installation": {
    "ou_quand": "Ce prompt s'installe **côté assistant de développement** : profil personnel du développeur ou configuration projet partagée. Active la règle pour **tout** code généré dans le contexte (pas seulement à la demande), donc à charger en début de projet ou de session.",
    "moments": [
      "profil",
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "Claude Code",
        "instruction": "Ajouter à `~/.claude/CLAUDE.md` (global, tous projets) ou `./CLAUDE.md` (projet). Couverture maximale : tout code généré dans Claude Code respectera la règle."
      },
      {
        "contexte": "GitHub Copilot Chat / Cursor",
        "instruction": "**Custom Instructions** de l'extension ou `.cursorrules` à la racine du projet. Compléter par un linter (ESLint plugin `security`, Bandit pour Python) qui détecte les `e.message` en réponse HTTP."
      },
      {
        "contexte": "ChatGPT (Custom GPT « Code Reviewer »)",
        "instruction": "**Custom GPT → Instructions**. Indiquer aux développeurs d'utiliser ce GPT pour toute génération de code serveur."
      },
      {
        "contexte": "Cursor / Codeium (équipe)",
        "instruction": "Coller dans le `.cursorrules` versionné dans le repo. ⚠️ Ajouter une règle CI (Gitleaks pour `console.log(error)`, custom lint pour `res.send(e.message)`)."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-21",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 240,
    "sortie": null
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-21",
      "version": "1.1",
      "summary": "Mise à jour éditoriale"
    }
  ]
}
