Перейти к основному содержимому
🔒 Режим превью. Первые 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\`. Правила: - Если \`фильтр\` не является словарем → поднимите \`ValueError("фильтр должен быть словарем")\`. - Если \`tenant_id\` отсутствует ИЛИ пусто/ложно → поднимите \`ValueError("БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым")\`. - В противном случае верните \`f"OK | {query!r} с областью действия арендатора {filter['tenant_id']!r}"\`. Затем запустите его для четырех форм запроса (двух реальных и двух небезопасных): \`\`\` ОК | «Политика возврата» распространяется на «высшую точку» арендатора ЗАБЛОКИРОВАНО | «таблица зарплат» | БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым. ОК | «история заказов» ограничена арендатором «globex» ЗАБЛОКИРОВАНО | «Ключи API» | БЕЗОПАСНОСТЬ: фильтр tenant_id является обязательным и непустым. \`\`\` Случай с пустой строкой является коварным: \`"tenant_id" в фильтре\` пройдет, но \`filter.get("tenant_id")\` возвращает ложь. **Всегда проверяйте достоверность, а не просто наличие ключа.** Неверно настроенный интерфейс, в котором по умолчанию для \`tenant_id\` установлено значение \`""\`, привел к реальным утечкам данных между арендаторами. 📋Выберите правильный ответ. 💡 **Подсказка:** Если вы не уверены, перечитайте приведенную выше теорию.
✏️ Пиши код здесь
🐍
Загрузка Python...
Одноразовая загрузка (~1 МБ). Далее — мгновенно.
📊 Результат
Нажмите «Запустить», чтобы увидеть результат...

💬 Обсуждение

Будьте первым — задайте вопрос или поделитесь подсказкой.
Войдите чтобы участвовать в обсуждении. Чтение бесплатно.
Загрузка обсуждения…