В событие попадает всё, что туда положило приложение: тексты исключений, хлебные крошки, атрибуты логов, адреса, теги и контексты. Очевидные секреты Buglapse вычищает на сервере до сохранения события — пароли, токены, номера карт не попадают в базу. Свои правила проект добавляет в Настройки → Безопасность и приватность.
Коротко, что сделать:
- Ничего — серверная очистка включена по умолчанию.
- Если в событиях бывают свои персональные поля (ИНН, паспорт) — добавьте их в Дополнительные чувствительные поля.
- Если IP посетителей хранить нельзя — включите Хэшировать IP-адреса.
- Для записи сессий — скройте личные данные классами
buglapse-mask/buglapse-block.
Очистка на сервере
Очистка выполняется для каждого принятого события, каким бы SDK оно ни было отправлено, — SDK Buglapse или официальным SDK Sentry. Она включена по умолчанию. Очищенное значение заменяется на [Filtered]; исходное нигде не сохраняется.
Чувствительные ключи
Ключ считается чувствительным, если в нижнем регистре и без -, _ и . он содержит одно из:
text
password passwd pwd secret passphrase token apikey accesskey privatekey auth
credential cookie session csrf xsrf creditcard cardnumber cvv iban ssnТак что под правило попадают api_key, X-Api-Key, Authorization, access_token и credit-card. Значение чувствительного ключа становится [Filtered] — вложенный объект тоже целиком. Ключи проверяются в:
| Где | Что |
|---|---|
| Теги и контексты (все события) | Для составного ключа контекста вроде request.cookies — последний сегмент (cookies) |
| Хлебные крошки исключений | Каждый ключ в data, на любой глубине |
| Логи | Каждый ключ в attributes, на любой глубине |
Идентификаторы, на которые опирается сам Buglapse, — user.id, user.email, user.username, user.name, trace.id, span.id, replay.id, session.id, release, environment — не очищаются никогда.
Чувствительные значения
В свободном тексте — сообщениях исключений и их причин, хлебных крошек, логов, названиях спанов — и в каждом строковом значении перечисленных выше мест заменяются:
- номера карт (13–19 цифр, возможно сгруппированных пробелами или дефисами, прошедшие проверку по алгоритму Луна) —
Order 1234567890123456, не являющийся номером карты, останется как есть; - учётные данные
Bearer …иBasic …(схема сохраняется:Bearer [Filtered]); - JWT, PEM-блоки приватных ключей, идентификаторы ключей доступа AWS;
- пары
key=valueи"key": "value"с чувствительным ключом — в query-строках, cookie, JSON-подобном тексте:https://shop.example.com/cb?code=1&access_token=[Filtered].
[Filtered] — константа, поэтому исключения, сообщения которых отличаются только токеном, по-прежнему группируются в один инцидент.
Правила проекта
| Настройка | Что делает |
|---|---|
| Очищать чувствительные данные | Если выключить, правила по ключам и значениям выше не применяются вовсе |
| Стандартные чувствительные поля | Выключите, чтобы отказаться от встроенного списка ключей; ваши поля продолжат работать |
| Дополнительные чувствительные поля | Свои ключи, сравниваются как стандартные (подстрока без учёта регистра, -, _, .), например inn, passport |
| Безопасные поля | Точные ключи, которые не очищаются никогда, — для ключа, ошибочно задетого стандартным списком, например author (содержит auth) |
Свои поля и хэширование IP — функции платных тарифов.
Правила применяются к событиям, полученным после изменения. Уже сохранённые события очистка не переписывает — если что-то проскочило, удалите их.
Фильтры видят исходные данные
Входящие фильтры и выражение фильтра проекта срабатывают до очистки, поэтому пишите их по текстам, которые действительно генерирует ваш код.
IP-адреса
По умолчанию IP посетителя хранится как пришёл (IP запроса для браузерного SDK; для серверного SDK — IP конечного пользователя, если SDK его передаёт). С включённым Хэшировать IP-адреса:
user.ipхранится какh:и хэш, постоянный в пределах проекта: тот же посетитель по-прежнему считается одним пользователем, но адрес прочитать нельзя, а в другом проекте тот же IP даёт другой хэш;- адреса IPv4/IPv6 в свободном тексте заменяются на
[Filtered].
Записи сессий
Записи сессий на сервере не очищаются. Скрывайте персональные данные в SDK опциями маскирования интеграции записи: maskAllInputs, maskTextClass и blockClass. См. также Запись сессий.
Что SDK собирает по умолчанию
SDK никогда не отправляют тела запросов и ответов, заголовки, cookie и значения полей форм. То, что их интеграции записывают автоматически, управляется опцией sendDefaultPii (по умолчанию false):
sendDefaultPii: false (по умолчанию) | sendDefaultPii: true | |
|---|---|---|
Адреса, которые SDK записывает сам, — URL запроса и referrer, хлебные крошки fetch/XHR/навигации, http.url у спанов, логи HTTP-ошибок и ошибок ресурсов | Путь и имена параметров сохраняются, значения заменяются: /search?q=[Filtered]&page=[Filtered] | Как есть |
Хлебные крошки взаимодействий и названия спанов ui.action (браузер) | Атрибуты элемента (aria-label, title, placeholder, …) и подпись элемента управления — кнопки, ссылки, вкладки. Никогда — значение поля; ничего — внутри data-buglapse-mask | Ещё и видимый текст любого другого элемента |
Подпись элемента управления читается по умолчанию, потому что это текст самой страницы. Если это текст человека — ссылка «Иван Иванов» в списке клиентов, — поставьте на список data-buglapse-mask; см. Как называется элемент.
ts
Buglapse.init({
dsn: '{dsn}',
sendDefaultPii: false,
})Со script-тегом включается атрибутом data-send-default-pii="true". Данные, которые вы передаёте сами, — setUser(), тексты исключений и логов, атрибуты, теги, контексты — отправляются как есть в любом случае.
Удаление данных в SDK
Серверные правила ловят типовые секреты, но не любые персональные данные в ваших сообщениях. Всё специфичное для приложения переписывайте или отбрасывайте до отправки — в beforeSend и beforeBreadcrumb. Оба вызываются последними, после всех интеграций, а null отбрасывает событие или крошку:
ts
Buglapse.init({
dsn: '{dsn}',
beforeSend(event, hint) {
if (event.type === 'exception') {
event.payload.message = event.payload.message.replace(/order #\d+/gi, 'order #…')
}
return event
},
beforeBreadcrumb(breadcrumb) {
return breadcrumb.type === 'console' ? null : breadcrumb
},
})Собственные интеграции могут переписывать события через addPreprocessor() — такие обработчики выполняются до beforeSend.
Удаление данных пользователя
Если человек просит удалить его данные, откройте Настройки → Безопасность и приватность → Данные пользователей, найдите его по email, внешнему id или IP и откройте карточку. Удалить пользователя удаляет его вместе со всеми привязанными к нему событиями — исключениями, трейсами со спанами, логами, записями сессий и сессиями — и пересчитывает инциденты и релизы, к которым эти события относились. Отменить это нельзя.
Та же карточка открывается из блока пользователя в любом событии и из списка затронутых пользователей инцидента.