Compito
📝 **Domanda:** **Scrivi la funzione** \`safe_search(query, filter)\` che protegge un RAG multi-tenant dalla classe di leak n. 1: un filtro \`tenant_id\` mancante.
Regole:
- Se \`filter\` non è un dict → solleva \`ValueError("il filtro deve essere un dict")\`.
- Se \`tenant_id\` è assente OPPURE vuoto/falsy → solleva \`ValueError("SICUREZZA: il filtro tenant_id è obbligatorio e non vuoto")\`.
- Altrimenti restituisce \`f"OK | {query!r} con ambito tenant {filter['tenant_id']!r}"\`.
Quindi eseguilo contro quattro forme di richiesta (due reali, due non sicure):
\`\`\`
Va bene | "politica di rimborso" limitata all'inquilino "acme"
BLOCCATO | 'tabella degli stipendi' | SICUREZZA: il filtro tenant_id è obbligatorio e non vuoto
Va bene | 'cronologia ordini' con ambito tenant 'globex'
BLOCCATO | 'Chiavi API' | SICUREZZA: il filtro tenant_id è obbligatorio e non vuoto
\`\`\`
Il caso della stringa vuota è quello subdolo: \`"tenant_id" in filter\` passerebbe, ma \`filter.get("tenant_id")\` restituisce false. **Controlla sempre la verità, mai solo la presenza della chiave.** Un frontend configurato in modo errato con il valore predefinito di \`tenant_id\` su \`""\` ha causato perdite di dati tra tenant nel mondo reale.
📋 Scegli la risposta giusta.
💡 **Suggerimento:** Rileggi la teoria sopra se non sei sicuro.