Перейти к содержимому

В событие попадает всё, что туда положило приложение: тексты исключений, хлебные крошки, атрибуты логов, адреса, теги и контексты. Очевидные секреты Buglapse вычищает на сервере до сохранения события — пароли, токены, номера карт не попадают в базу. Свои правила проект добавляет в Настройки → Безопасность и приватность.

Коротко, что сделать:

  1. Ничего — серверная очистка включена по умолчанию.
  2. Если в событиях бывают свои персональные поля (ИНН, паспорт) — добавьте их в Дополнительные чувствительные поля.
  3. Если IP посетителей хранить нельзя — включите Хэшировать IP-адреса.
  4. Для записи сессий — скройте личные данные классами 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 и откройте карточку. Удалить пользователя удаляет его вместе со всеми привязанными к нему событиями — исключениями, трейсами со спанами, логами, записями сессий и сессиями — и пересчитывает инциденты и релизы, к которым эти события относились. Отменить это нельзя.

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