Zadanie
📝 **Pytanie:** **Napisz funkcję** \`safe_search(query, filter)\`, która chroni RAG z wieloma dzierżawcami przed klasą wycieku nr 1 — brakującym filtrem \`ident_tenant_id\`.
Zasady:
- Jeśli \`filter\` nie jest dyktandem → podnieś \`ValueError("filter musi być dyktandem")\`.
- Jeśli \`ident_dzierżawcy\` jest nieobecny LUB pusty/fałsz → podnieś \`ValueError("BEZPIECZEŃSTWO: filtr identyfikatora_dzierżawy jest obowiązkowy i niepusty")\`.
- W przeciwnym razie zwróć \`f"OK | {query!r} w zakresie do najemcy {filter['tenant_id']!r}"\`.
Następnie uruchom go w oparciu o cztery kształty żądań (dwa rzeczywiste, dwa niebezpieczne):
\`\`\`
OK | „Zasady zwrotów” obejmujące najemcę „acme”
ZABLOKOWANE | „tabela wynagrodzeń” | BEZPIECZEŃSTWO: filtr identyfikatora najemcy jest obowiązkowy i niepusty
OK | „historia zamówień” ograniczona do najemcy „globex”
ZABLOKOWANE | „Klucze API” | BEZPIECZEŃSTWO: filtr identyfikatora najemcy jest obowiązkowy i niepusty
\`\`\`
Przypadek z pustym ciągiem jest podstępny — \`„identyfikator_dzierżawcy” w filtrze\` przejdzie, ale \`filter.get("id_dzierżawcy")\` zwraca wartość fałsz. **Zawsze sprawdzaj prawdę, nigdy tylko obecność klucza.** Źle skonfigurowany interfejs użytkownika, domyślnie ustawiając \`tenant_id\` na \`””\`, spowodował wycieki między dzierżawcami w świecie rzeczywistym.
📋 Wybierz właściwą odpowiedź.
💡 **Wskazówka:** Jeśli nie jesteś pewien, przeczytaj ponownie powyższą teorię.