Tâche
📝 **Question :** **Écrivez la fonction** \`safe_search(query, filter)\` qui protège un RAG multi-tenant contre la classe de fuite n°1 — un filtre \`tenant_id\` manquant.
Règles :
- Si \`filter\` n'est pas un dict → lever \`ValueError("le filtre doit être un dict")\`.
- Si \`tenant_id\` est absent OU vide/faux → raise \`ValueError("SECURITY : le filtre tenant_id est obligatoire et non vide")\`.
- Sinon, retournez \`f"OK | {query!r} étendu au locataire {filter['tenant_id']!r}"\`.
Ensuite, exécutez-le sur quatre formes de requête (deux réelles, deux dangereuses) :
\`\`\`
D'accord | La « politique de remboursement » s'étend au locataire « acme »
BLOQUÉ | 'tableau des salaires' | SÉCURITÉ : le filtre tenant_id est obligatoire et non vide
D'accord | « historique des commandes » limité au locataire « globex »
BLOQUÉ | 'Clés API' | SÉCURITÉ : le filtre tenant_id est obligatoire et non vide
\`\`\`
Le cas de la chaîne vide est le cas sournois — \`"tenant_id" dans filter\` passerait, mais \`filter.get("tenant_id")\` renvoie faux. ** Vérifiez toujours la véracité, jamais seulement la présence de la clé. ** Une interface frontale mal configurée définissant par défaut \`tenant_id\` sur \`""\` a provoqué des fuites entre locataires dans le monde réel.
📋 Choisissez la bonne réponse.
💡 **Indice :** Relisez la théorie ci-dessus en cas de doute.