{
  "id": "pii-output-filter-n2",
  "code": "PS-0008",
  "titre": "Filtre de sortie sur les données sensibles avant affichage",
  "resume": "Demande au modèle de vérifier sa propre réponse avant de la produire et de masquer tout fragment qui ressemble à une donnée personnelle ou confidentielle.",
  "type_ia": "conversationnelle",
  "piliers": [
    "securite-productions"
  ],
  "niveau": "N2",
  "owasp": [
    "LLM02"
  ],
  "tags": [
    "pii",
    "fuite-donnees",
    "validation-sortie",
    "entreprise"
  ],
  "prompt_fr": "Avant de produire ta réponse finale, effectue une vérification interne.\n\n**Étapes**\n1. Ta réponse contient-elle des numéros de téléphone, emails, adresses, numéros d'identification, mots de passe, clés API ou données de santé ?\n2. Si oui, remplace chaque occurrence par `[DONNÉES MASQUÉES]` avant d'afficher.\n3. Si la demande nécessite de telles données pour être traitée, demande une confirmation explicite et explique pourquoi.\n\nCette vérification est **obligatoire pour chaque réponse**, sans exception.\n\n**Livrables à produire**\n- **Réponse filtrée** : texte avec les PII remplacées par `[DONNÉES MASQUÉES]`, avec mention en pied : « *N PII masquées dans cette réponse.* » si applicable.\n- **Métadonnée de filtrage** (JSON-line à émettre en fin de réponse) :\n  `[OUTPUT_FILTER_APPLIED] {\"ts\":\"<ISO8601>\",\"pii_count\":<n>,\"types\":[\"<email|telephone|adresse|ssn|api-key|sante|autre>\"]}`",
  "prompt_en": "Before producing your final response, perform an internal check.\n\n**Steps**\n1. Does your response contain phone numbers, emails, addresses, ID numbers, passwords, API keys or health data?\n2. If yes, replace each occurrence with `[MASKED DATA]` before displaying.\n3. If the request requires such data to be processed, ask for explicit confirmation and explain why.\n\nThis check is **mandatory for every response**, no exceptions.\n\n**Deliverables to produce**\n- **Filtered response**: text with PII replaced by `[MASKED DATA]`, with footer note: \"*N PII masked in this response.*\" if applicable.\n- **Filter metadata** (JSON-line, emit at end of response):\n  `[OUTPUT_FILTER_APPLIED] {\"ts\":\"<ISO8601>\",\"pii_count\":<n>,\"types\":[\"<email|phone|address|ssn|api-key|health|other>\"]}`",
  "langue_recommandee": "indifferent",
  "modeles_recommandes": [
    "claude",
    "gpt",
    "tous"
  ],
  "source": {
    "auteur": "OpenAI Safety Team",
    "organisation": "OpenAI",
    "url": "https://platform.openai.com/docs/guides/safety-best-practices",
    "type": "officielle"
  },
  "cumulable_avec": [
    "pii-non-disclosure-n1",
    "system-prompt-boundaries-n1"
  ],
  "explication": "L'auto-vérification avant output est une technique recommandée à la fois par OWASP LLM02 et par le guide OpenAI Safety. Elle crée une couche de contrôle interne sans infrastructure externe.\n\n**Quand l'utiliser :** assistants traitant des données métier, support client, outils RH, tout contexte avec données personnelles en entrée.\n\n**Ce qu'il protège :** LLM02 — fuite de données sensibles en sortie. Cumule avec PS-0007 pour une protection complète. La métadonnée `[OUTPUT_FILTER_APPLIED]` permet de mesurer le taux de PII vues en sortie — indicateur clé RGPD.\n\n**Couverture MITRE ATLAS :** [AML.T0057](https://atlas.mitre.org/techniques/AML.T0057) (LLM Data Leakage).",
  "installation": {
    "ou_quand": "À installer **dès le déploiement** de tout assistant qui lit des données personnelles. Cumulable avec `pii-non-disclosure-n1` (refus en entrée) pour une défense en profondeur. ⚠️ Ne remplace pas un filtrage backend (regex en aval) — défense en profondeur.",
    "moments": [
      "profil",
      "projet-debut"
    ],
    "exemples": [
      {
        "contexte": "ChatGPT (Custom GPT / Projet RH)",
        "instruction": "**Projet ou Custom GPT → Instructions** — coller le prompt. Pour les usages personnels (review de documents avant envoi), coller dans les **Custom Instructions** du profil."
      },
      {
        "contexte": "Claude.ai / API Anthropic",
        "instruction": "**Projet → Custom Instructions** ou paramètre **`system`**. Côté backend : capturer `[OUTPUT_FILTER_APPLIED]` pour mesurer le taux de filtrage et identifier les usages à risque."
      },
      {
        "contexte": "Application en production (chatbot, support)",
        "instruction": "Coller dans `system_prompt` côté backend + **doubler avec un filtre regex en aval** (libraries : Presidio, scrubadub). Le LLM est probabiliste — il faut une seconde ligne déterministe."
      },
      {
        "contexte": "Mistral / API OpenAI",
        "instruction": "Paramètre **`system`** + Moderation API en amont pour bloquer les inputs contenant déjà des PII (réduit la pression sur le filtre de sortie)."
      }
    ]
  },
  "date_creation": "2026-05-17",
  "date_maj": "2026-05-24",
  "version": "1.1",
  "tokens_estimes": {
    "entree": 220,
    "sortie": null
  },
  "referentiels": {
    "mitre_atlas": [
      "AML.T0057"
    ]
  },
  "changelog": [
    {
      "date": "2026-05-17",
      "version": "1.0",
      "summary": "Création de la fiche"
    },
    {
      "date": "2026-05-24",
      "version": "1.1",
      "summary": "Ajout couverture MITRE ATLAS (AML.T0057)"
    }
  ]
}
