隐私

配置 Session Replay 以维护用户和数据隐私。

如果您有任何问题、反馈或想要报告错误,请打开一个 GitHub issue,并附上相关重放的链接,或者如果可能的话,提供一个可公开访问的页面 URL,该页面是您尝试记录重放的页面。

有几种方法可以处理个人可识别信息 (PII)。默认情况下,Session Replay SDK 在发送到服务器之前会用 * 遮罩所有文本内容,并阻止所有媒体元素(img, svg, video, object, picture, embed, map, audio)。可以通过将 maskAllText 设置为 false 来禁用此功能。您还可以通过向特定 DOM 元素添加以下 CSS 类来防止记录其内容:sentry-blocksentry-ignoresentry-mask。以下部分将展示不同方法如何处理内容的示例。

遮罩会用其他内容替换文本内容。默认的遮罩行为是将每个字符替换为 *。具有类名 sentry-mask 或属性 data-sentry-mask 的元素将被遮罩。在本例中,相关的 HTML 代码是:<table class="sentry-mask">...</table>

Replay PII 清理示例

您可以通过以下 配置 来设置要遮罩或取消遮罩的内容:

Copied
replayIntegration({
  mask: [".mask-me"],
  unmask: [".unmask-me"],
});

阻止会用一个具有相同尺寸的占位符替换元素。录制将显示一个空白空间来代替内容。具有类名 sentry-block 或属性 data-sentry-block 的元素将被阻止。在本例中,相关的 HTML 代码是:<table data-sentry-block>...</table>

阻止示例

您可以通过以下 配置 来设置要阻止或取消阻止的内容:

Copied
replayIntegration({
  block: [".block-me"],
  unblock: [".unblock-me"],
});

忽略仅适用于表单输入。输入元素上的事件将被忽略,因此重放不会显示输入内部发生的内容。具有类名 sentry-ignore 或属性 data-sentry-ignore 的输入元素上的任何事件都将被忽略。请注意下表中的结果显示了输入变化,但没有可见文本:

忽略示例

您可以通过以下 配置 来设置要忽略的内容:

Copied
replayIntegration({
  ignore: [".ignore-me"],
});

如果您正在处理一个没有个人可识别信息或其他类型私有数据的静态网站,您可以通过配置 maskAllTextblockAllMedia 配置选项分别选择退出默认的文本遮罩和图像阻止:

Copied
Sentry.replayIntegration({
  // NOTE: This will disable built-in masking. Only use this if your site has no sensitive data, or if you've already set up other options for masking or blocking relevant data, such as 'ignore', 'block', 'mask' and 'maskFn'.
  maskAllText: false,
  blockAllMedia: false,
});

从 v8 开始,unblockunmask 选项不再添加默认的 DOM 选择器。如果您希望保持之前版本的默认行为,则应在配置中明确指定它们:

Copied
Sentry.replayIntegration({
  unblock: [".sentry-unblock, [data-sentry-unblock]"],
  unmask: [".sentry-unmask, [data-sentry-unmask]"],
});

以下是在 replayIntegration({}) 中可以使用的完整选项列表:

类型默认值描述
maskstring[]['.sentry-mask', '[data-sentry-mask]']遮罩与给定 DOM 选择器匹配的所有元素。请参阅 遮罩 部分以了解示例。注意,任何配置的选择器都将附加到默认选择器上。
maskAllTextbooleantrue遮罩所有文本内容。在发送到服务器之前,文本内容将通过 maskFn 进行处理。
maskAllInputsbooleantrue遮罩 <input> 元素的值。在发送到服务器之前,输入值将通过 maskFn 进行处理。
blockstring[]['.sentry-block', '[data-sentry-block]']红acted与给定 DOM 选择器匹配的所有元素。请参阅 阻止 部分以了解示例。注意,任何配置的选择器都将附加到默认选择器上。
blockAllMediabooleantrue阻止所有媒体元素(img, svg, video, object, picture, embed, map, audio)。
ignorestring[]['.sentry-ignore', '[data-sentry-ignore]']忽略与匹配输入字段上的所有事件。请参阅上方的 忽略 示例。
maskFn(text: string) => string(s) => '*'.repeat(s.length)自定义在发送到服务器之前如何遮罩文本内容的函数。默认情况下,用 * 遮罩文本。
unblockstring[][]不红acted与给定 DOM 选择器匹配的任何元素。用于取消 blockAllMedia 阻止的具体媒体元素。这不影响如 password 等敏感元素。
unmaskstring[][]取消遮罩与给定 DOM 选择器匹配的所有元素。用于取消 maskAllText 遮罩的具体元素。

收集请求和响应体是一个可选功能。这是因为避免 PII 进入 Sentry 的最佳方法是不添加可能包含 PII 的端点 URL。 此外,Sentry 会尝试从请求和响应体中 清理 某些类型的敏感数据,如果您不小心选择了包含此类数据的 URL。此机制发生在我们的摄入服务中,在数据写入磁盘之前进行。这是一种尽力而为的方法,通过模式匹配内容中的信用卡信息、社会安全号码和 密码 等信息。

有关此功能的更多详细信息,请参阅 配置页面

从 SDK 版本 7.53.0 开始,添加了 beforeAddRecordingEvent。它允许您在事件离开浏览器之前修改、清理记录以移除 PII,或忽略记录事件。这些事件包括控制台日志、网络请求和响应数据。

Copied
Sentry.replayIntegration({
  beforeAddRecordingEvent: (event) => {
    // Filter out specific events
    if (event.data.tag === "foo") {
      return null;
    }

    // Remember to return an event if you want to keep it!
    return event;
  },
});

以下示例展示了如何仅捕获返回 500 状态码的 fetch 请求。(非 fetch 请求将继续正常捕获。)

Copied
Sentry.replayIntegration({
  beforeAddRecordingEvent: (event) => {
    // Do not capture fetch/xhr requests, unless the response code is 500
    if (
      event.data.tag === "performanceSpan" &&
      (event.data.payload.op === "resource.fetch" ||
        event.data.payload.op === "resource.xhr") &&
      event.data.payload.data.statusCode !== 500
    ) {
      return null;
    }

    return event;
  },
});

我们还提供了 服务器端 PII 清理 功能,用于查找某些模式,例如美国社会安全号码、信用卡和私钥。

默认情况下,URL 会存储在录制和重放事件中。

要在录制事件中清理 URL,请使用上述 beforeAddRecordingEvent

要在重放事件中清理 URL,请使用 addEventProcessor

Copied
Sentry.addEventProcessor((event) => {
  // Ensure that we specifically look at replay events
  if (event.type !== "replay_event") {
    // Return the event, otherwise the event will be dropped
    return event;
  }

  // Your URL scrubbing function
  function urlScrubber(url) {
    return url.replace(/([a-z0-9]{3}\.[a-z]{5}\.[a-z]{7})/, "[Filtered]");
  }

  // Scrub all URLs with your scrubbing function
  event.urls = event.urls && event.urls.map(urlScrubber);

  return event;
});

请注意,版本 7.35.0 之前的隐私 API 已被弃用,并替换为上述选项。请参阅 Replay 迁移指南 以获取更多信息。