Перейти до основного вмісту
🔒 Режим прев'ю. Перші 15 уроків Foundations — безкоштовні; цей — Pro. Запусти 7-денний trial щоб відкрити редактор, AI-підказки і решту курсу. Потрібна картка, скасування в Dashboard у будь-який момент.Почати 7-денний trial →
← КурсиAI Engineering with PythonМодуль 3 · RAG (доповнена пошуково-пошукова генерація)Фільтрація метаданихwrite39 / 105
+75 XP
Завдання
📝 **Питання:** **Напишіть функцію** \`safe_search(query, filter)\`, яка захищає мультитенантний RAG від класу витоку №1 — відсутній фільтр \`tenant_id\`. правила: - Якщо \`filter\` не є dict → викликати \`ValueError("filter must be a dict")\`. - Якщо \`tenant_id\` відсутній АБО пустий/хибний → викликати \`ValueError("БЕЗПЕКА: фільтр 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\` має значення \`""\`, спричинив витік між клієнтами в реальному світі. 📋 Виберіть правильну відповідь. 💡 **Підказка:** Перечитайте наведену вище теорію, якщо не впевнені.
✏️ Пиши код тут
🐍
Завантаження Python...
Одноразове завантаження (~1 МБ). Далі — миттєво.
📊 Результат
Натисніть «Запустити», щоб побачити результат...

💬 Обговорення

Будьте першим — поставте запитання або поділіться порадою.
Увійдіть щоб приєднатися до обговорення. Читання безкоштовне.
Завантаження обговорення…