Εργασία
📝 **Ερώτηση:** **Γράψτε τη συνάρτηση** \`safe_search(query, filter)\` που προστατεύει ένα RAG πολλαπλών ενοικιαστών από την κλάση διαρροής #1 — ένα φίλτρο \`tenant_id\` που λείπει.
Κανόνες:
- Εάν το \`filter\` δεν είναι dict → raise \`ValueError("το φίλτρο πρέπει να είναι dict")\`.
- Εάν το \`tenant_id\` απουσιάζει Ή κενό/ψευδές → raise \`ValueError("SECURITY: το φίλτρο tenant_id είναι υποχρεωτικό και δεν είναι κενό")\`.
- Διαφορετικά επιστρέψτε το \`f"OK | {query!r} με εύρος στον ενοικιαστή {filter['tenant_id']!r}"\`.
Στη συνέχεια, εκτελέστε το σε τέσσερα σχήματα αιτημάτων (δύο πραγματικά, δύο μη ασφαλή):
\`\`\`
ΟΚ | «πολιτική επιστροφής χρημάτων» που καλύπτεται από τον ενοικιαστή «acme»
ΑΠΟΚΛΕΙΣΜΕΝΟΣ | «πίνακας μισθών» | ΑΣΦΑΛΕΙΑ: Το φίλτρο tenant_id είναι υποχρεωτικό και δεν είναι κενό
ΟΚ | Το "ιστορικό παραγγελιών" καλύπτεται από τον ενοικιαστή "globex"
ΑΠΟΚΛΕΙΣΜΕΝΟΣ | 'Κλειδιά API' | ΑΣΦΑΛΕΙΑ: Το φίλτρο tenant_id είναι υποχρεωτικό και δεν είναι κενό
\`\`\`
Η περίπτωση κενού συμβολοσειράς είναι η ύπουλη — το \`"tenant_id" στο φίλτρο\` θα περνούσε, αλλά το \`filter.get("tenant_id")\` επιστρέφει ψευδής. **Να ελέγχετε πάντα την αλήθεια, ποτέ μόνο την παρουσία κλειδιού.** Μια εσφαλμένη διαμόρφωση διεπαφής με προεπιλογή του \`tenant_id\` σε \`""\` έχει προκαλέσει διαρροές μεταξύ ενοικιαστών στον πραγματικό κόσμο.
📋 Επιλέξτε τη σωστή απάντηση.
💡 **Υπόδειξη: ** Ξαναδιαβάστε την παραπάνω θεωρία εάν δεν είστε σίγουροι.