Оптимизация, тестирование и безопасность

Обнаружение персональных данных и секретов в промптах

Как ключи API, пароли и персональные данные попадают в промпты LLM, как работает обнаружение конфиденциальной информации и как скрывать её до отправки.

  • Автор: Vijayraj Palanisamy
  • Обновлено
  • 4 мин чтения

Перевод английского оригинала. Код, промпты и вывод моделей оставлены на английском.

Каждый промпт, отправленный в размещённую модель, покидает вашу среду. Если в нём есть ключ API, пароль или персональные данные клиента, эта информация теперь находится в чужих системах и, возможно, в логах с обеих сторон. Обнаружение конфиденциальной информации — это практика поиска такого содержимого до отправки промпта.

Как конфиденциальные данные попадают в промпты

Редко намеренно. Обычные пути:

  • Вставленные логи и трассировки стека, включающие токены, строки подключения или cookie сессий.
  • Файлы конфигурации, которыми делятся для отладки: .env, YAML, Terraform.
  • Код с жёстко прописанными учётными данными.
  • Записи о клиентах в заявках в поддержку, письмах и расшифровках чатов.
  • Извлечённые документы, содержащие больше, чем нужно вопросу.
  • Файлы промптов в репозитории, где кто-то тестировал с настоящим ключом.
  • Результаты инструментов в цикле агента, переданные модели без фильтрации.

Две категории, два вида риска

Секреты дают доступ: ключи API, токены, пароли, закрытые ключи, строки подключения. Утёкший секрет можно использовать сразу. Ответ — отозвать и сменить его.

Персональные данные (PII) идентифицируют людей: имена, адреса электронной почты, номера телефонов, почтовые адреса, номера платёжных карт, номера национальных удостоверений. Их отправка может нарушить ваши обязательства по конфиденциальности или закон, и их нельзя сменить.

Как работает обнаружение

Детекторы сочетают несколько методов, потому что у каждого есть слепые зоны.

Известные форматы. Многие провайдеры выдают ключи с узнаваемым префиксом и длиной. Их можно сопоставлять с высокой уверенностью.

Контекстные шаблоны. Присваивание вроде password = "..." или api_key: ... помечает значение как учётные данные независимо от формата.

Энтропия. Случайные строки имеют высокую энтропию Шеннона. Длинное значение с высокой энтропией рядом со словом «token» или «secret», вероятно, является учётными данными, даже в неизвестном формате.

Структурированные идентификаторы. Адреса электронной почты, номера телефонов и карт следуют шаблонам. Номера карт можно подтвердить контрольной суммой.

Распознавание именованных сущностей. Статистические модели находят имена, организации и места, у которых нет фиксированного шаблона. Больше охват, больше ложных срабатываний, и нужна модель.

Сканер безопасности промптов PromptFlowEngine использует первые четыре. Он детерминирован и работает локально, поэтому текст, проверяемый на секреты, никуда не отправляется для проверки.

Сообщайте места, а не значения

Детектор, который печатает найденный секрет, создал вторую копию секрета — в логе или терминале. Хорошо ведущий себя сканер возвращает только категорию и позицию:

{
  "hasSensitiveData": true,
  "countsByCategory": { "api_key": 1, "email": 1 },
  "matches": [
    { "category": "api_key", "start": 118, "end": 164 },
    { "category": "email", "start": 176, "end": 196 }
  ]
}

В таком виде PromptFlowEngine возвращает результат во всех интерфейсах. Разобранный пример см. в правиле о конфиденциальных данных.

Скрытие (редактирование)

Скрытие заменяет каждое обнаруженное значение заполнителем, сохраняющим смысл окружающего текста.

Before: Connect with postgres://admin:hunter2@db.internal:5432/app
After:  Connect with [REDACTED_CONNECTION_STRING]

Типизированные заполнители вроде [REDACTED_API_KEY] лучше ряда звёздочек: модель по-прежнему знает, что там было, и может рассуждать об этом («строка подключения выглядит неправильно сформированной»), не видя самой строки.

Для персональных данных, на которые задаче нужно ссылаться, используйте согласованные псевдонимы в пределах запроса: каждое вхождение одного адреса электронной почты становится [EMAIL_1], следующий адрес — [EMAIL_2]. Тогда модель может различать людей, а ваше приложение — сопоставить заполнители обратно после ответа.

Где разместить проверку

Обнаруживайте как можно раньше и более чем в одном месте.

Где Что перехватывает
В редакторе или поле чата Вставку, до отправки
В коде приложения, до вызова API Данные пользователей, записи и извлечение
Между шагами агента Результаты инструментов, готовые попасть в контекст
В CI, на файлах промптов Учётные данные, закоммиченные в репозиторий
Перед логированием Содержимое, которое вот-вот будет сохранено

Расширение для Chrome предупреждает, когда черновик в ChatGPT, Claude или Gemini содержит секрет, и может скрыть его на вашем устройстве. Расширение для VS Code запускает защиту приватности перед отправкой промпта в чат, с режимами строгий, скрытие и предупреждение. В CI контрольная точка по умолчанию падает при любой критической находке, так что закоммиченный ключ останавливает сборку.

Варианты политики: блокировать, скрывать или предупреждать

  • Блокировать, когда секрет не должен отправляться никогда. Самое безопасное, самое неудобное.
  • Скрывать по умолчанию. Промпт уходит без конфиденциальных значений.
  • Предупреждать, когда решение должен принять человек, например при возможном ложном срабатывании в коде.

Что бы вы ни выбрали, применяйте обнаружение секретов локально. Проверка, которая отправляет текст удалённому сервису, чтобы выяснить, безопасно ли его отправлять, лишает смысла саму себя.

Ограничения, которые нужно знать

  • Ложные пропуски. Секрет в необычном формате или персональные данные без шаблона, например описание человека, могут пройти. Обнаружение снижает риск; оно не удостоверяет, что промпт чист.
  • Ложные срабатывания. Хеши, UUID и тестовые фикстуры могут выглядеть как секреты. Вносите известные безопасные значения в список разрешённых, а не отключайте проверку.
  • Изображения и файлы. Текстовые сканеры не читают скриншоты или PDF, если их предварительно не преобразовать.
  • Контекст. Имя публично в одной ситуации и конфиденциально в другой. Решить это может только ваша политика.

Больше, чем обнаружение: отправляйте меньше

Самый надёжный контроль — вообще не включать данные.

  • Передавайте идентификатор и позвольте инструменту найти запись, чтобы модель никогда не видела ненужные ей поля.
  • Удаляйте поля до построения промпта.
  • Храните учётные данные в приложении и передавайте их инструментам напрямую. Модели никогда не нужен ваш ключ API, чтобы попросить инструмент вызвать API.
  • Используйте тестовые данные в примерах и файлах промптов.

Если секрет уже отправлен

  1. Немедленно отзовите и смените его. Считайте его скомпрометированным.
  2. Проверьте логи доступа на предмет использования.
  3. Удалите его из истории репозитория и файлов промптов.
  4. Добавьте проверку, чтобы тот же путь был перехвачен в следующий раз.

Об окружающей модели угроз см. безопасность промптов. Об атаках, пытающихся извлечь данные, когда они уже в контексте, см. инъекцию промптов.

Применить на практике

Попробуйте: безопасность промптов

Обнаруживает фразы-инъекции, утёкшие секреты и персональные данные и маскирует их. Бесплатно, детерминированно и без аккаунта.

Связанные инструменты PromptFlowEngine

Ещё по теме «оптимизация, тестирование и безопасность»

Все руководства по промпт-инжинирингу