Skip to content

Conversation

@luke-belton
Copy link
Contributor

@luke-belton luke-belton commented Nov 26, 2025

The logic for whether or not to capture certain elements (including sensitive data) was a bit confusing to follow, so trying to clear that up in this PR.

Originally I opened #2643 but that didn't really address the core issue.

In particular there were some cases such as that identified in #42648 where we'd identify sensitive data and prevent capturing of attributes, but still capture the actual elements (including attributes) inside $elements_chain.

Changes

  • Removes the sensitive field name regex by removing shouldCaptureElement (the remaining logic is now split into isExplicitNoCapture/isExplicitCapture)
  • That regex matched element names/IDs like password, ccnum, ssn and blocked capture
  • Why this is safe:
    • isSensitiveElement already protects ALL input/select/textarea elements by type
    • shouldCaptureValue still filters actual CC/SSN patterns from values
    • The regex was inconsistent (elements still appeared in $elements_chain) and caused false positives (e.g., blocking href capture and data-ph-capture-attribute attributes from <a id="password" data-ph-capture-attribute-key="value">Reset password</a>)
  • Explicit opt-out via ph-no-capture/ph-sensitive classes still works as expected

Release info Sub-libraries affected

Libraries affected

  • All of them
  • posthog-js (web)
  • posthog-js-lite (web lite)
  • posthog-node
  • posthog-react-native
  • @posthog/react
  • @posthog/ai
  • @posthog/nextjs-config
  • @posthog/nuxt

Checklist

  • Tests for new code
  • Accounted for the impact of any changes across different platforms
  • Accounted for backwards compatibility of any changes (no breaking changes!)
  • Took care not to unnecessarily increase the bundle size

If releasing new changes

  • Ran pnpm changeset to generate a changeset file
  • Added the "release" label to the PR to indicate we're publishing new versions for the affected packages

@vercel
Copy link

vercel bot commented Nov 26, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Updated (UTC)
posthog-js Ready Ready Preview Nov 27, 2025 5:46pm
posthog-nextjs-config Ready Ready Preview Nov 27, 2025 5:46pm

@posthog-bot
Copy link
Collaborator

Hey @luke-belton! 👋
This pull request seems to contain no description. Please add useful context, rationale, and/or any other information that will help make sense of this change now and in the distant Mars-based future.

@luke-belton luke-belton changed the title refactor sensitive data capture chore: refactor sensitive data capture Nov 26, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Nov 26, 2025

@github-actions
Copy link
Contributor

github-actions bot commented Nov 26, 2025

Size Change: -3.68 kB (-0.07%)

Total Size: 5.07 MB

Filename Size Change
packages/browser/dist/all-external-dependencies.js 227 kB -308 B (-0.14%)
packages/browser/dist/array.full.es5.js 300 kB -308 B (-0.1%)
packages/browser/dist/array.full.js 366 kB -308 B (-0.08%)
packages/browser/dist/array.full.no-external.js 381 kB -308 B (-0.08%)
packages/browser/dist/array.js 161 kB -305 B (-0.19%)
packages/browser/dist/array.no-external.js 174 kB -305 B (-0.18%)
packages/browser/dist/dead-clicks-autocapture.js 12.4 kB -304 B (-2.38%)
packages/browser/dist/main.js 163 kB -305 B (-0.19%)
packages/browser/dist/module.full.js 367 kB -308 B (-0.08%)
packages/browser/dist/module.full.no-external.js 381 kB -308 B (-0.08%)
packages/browser/dist/module.js 162 kB -305 B (-0.19%)
packages/browser/dist/module.no-external.js 175 kB -305 B (-0.17%)
ℹ️ View Unchanged
Filename Size Change
packages/ai/dist/anthropic/index.cjs 17.3 kB 0 B
packages/ai/dist/anthropic/index.mjs 17.2 kB 0 B
packages/ai/dist/gemini/index.cjs 21.2 kB 0 B
packages/ai/dist/gemini/index.mjs 21 kB 0 B
packages/ai/dist/index.cjs 138 kB 0 B
packages/ai/dist/index.mjs 137 kB 0 B
packages/ai/dist/langchain/index.cjs 40.8 kB 0 B
packages/ai/dist/langchain/index.mjs 40.3 kB 0 B
packages/ai/dist/openai/index.cjs 41.6 kB 0 B
packages/ai/dist/openai/index.mjs 41.3 kB 0 B
packages/ai/dist/vercel/index.cjs 29.6 kB 0 B
packages/ai/dist/vercel/index.mjs 29.6 kB 0 B
packages/browser/dist/crisp-chat-integration.js 2.11 kB 0 B
packages/browser/dist/customizations.full.js 19.2 kB 0 B
packages/browser/dist/exception-autocapture.js 11.7 kB 0 B
packages/browser/dist/external-scripts-loader.js 2.95 kB 0 B
packages/browser/dist/intercom-integration.js 2.16 kB 0 B
packages/browser/dist/lazy-recorder.js 150 kB 0 B
packages/browser/dist/posthog-recorder.js 246 kB 0 B
packages/browser/dist/recorder-v2.js 113 kB 0 B
packages/browser/dist/recorder.js 113 kB 0 B
packages/browser/dist/surveys-preview.js 72.5 kB 0 B
packages/browser/dist/surveys.js 84.3 kB 0 B
packages/browser/dist/tracing-headers.js 1.93 kB 0 B
packages/browser/dist/web-vitals.js 10.5 kB 0 B
packages/browser/react/dist/esm/index.js 18.8 kB 0 B
packages/browser/react/dist/umd/index.js 21.9 kB 0 B
packages/core/dist/error-tracking/chunk-ids.js 2.54 kB 0 B
packages/core/dist/error-tracking/chunk-ids.mjs 1.31 kB 0 B
packages/core/dist/error-tracking/coercers/dom-exception-coercer.js 2.3 kB 0 B
packages/core/dist/error-tracking/coercers/dom-exception-coercer.mjs 993 B 0 B
packages/core/dist/error-tracking/coercers/error-coercer.js 2.02 kB 0 B
packages/core/dist/error-tracking/coercers/error-coercer.mjs 794 B 0 B
packages/core/dist/error-tracking/coercers/error-event-coercer.js 1.76 kB 0 B
packages/core/dist/error-tracking/coercers/error-event-coercer.mjs 513 B 0 B
packages/core/dist/error-tracking/coercers/event-coercer.js 1.82 kB 0 B
packages/core/dist/error-tracking/coercers/event-coercer.mjs 548 B 0 B
packages/core/dist/error-tracking/coercers/index.js 6.79 kB 0 B
packages/core/dist/error-tracking/coercers/index.mjs 326 B 0 B
packages/core/dist/error-tracking/coercers/object-coercer.js 3.46 kB 0 B
packages/core/dist/error-tracking/coercers/object-coercer.mjs 2.07 kB 0 B
packages/core/dist/error-tracking/coercers/primitive-coercer.js 1.67 kB 0 B
packages/core/dist/error-tracking/coercers/primitive-coercer.mjs 419 B 0 B
packages/core/dist/error-tracking/coercers/promise-rejection-event.js 2.25 kB 0 B
packages/core/dist/error-tracking/coercers/promise-rejection-event.mjs 904 B 0 B
packages/core/dist/error-tracking/coercers/string-coercer.js 2.01 kB 0 B
packages/core/dist/error-tracking/coercers/string-coercer.mjs 820 B 0 B
packages/core/dist/error-tracking/coercers/utils.js 2.06 kB 0 B
packages/core/dist/error-tracking/coercers/utils.mjs 716 B 0 B
packages/core/dist/error-tracking/error-properties-builder.js 5.49 kB 0 B
packages/core/dist/error-tracking/error-properties-builder.mjs 4.15 kB 0 B
packages/core/dist/error-tracking/index.js 4.11 kB 0 B
packages/core/dist/error-tracking/index.mjs 152 B 0 B
packages/core/dist/error-tracking/parsers/base.js 1.83 kB 0 B
packages/core/dist/error-tracking/parsers/base.mjs 464 B 0 B
packages/core/dist/error-tracking/parsers/chrome.js 2.73 kB 0 B
packages/core/dist/error-tracking/parsers/chrome.mjs 1.32 kB 0 B
packages/core/dist/error-tracking/parsers/gecko.js 2.47 kB 0 B
packages/core/dist/error-tracking/parsers/gecko.mjs 1.13 kB 0 B
packages/core/dist/error-tracking/parsers/index.js 4.38 kB 0 B
packages/core/dist/error-tracking/parsers/index.mjs 1.94 kB 0 B
packages/core/dist/error-tracking/parsers/node.js 3.94 kB 0 B
packages/core/dist/error-tracking/parsers/node.mjs 2.68 kB 0 B
packages/core/dist/error-tracking/parsers/opera.js 2.26 kB 0 B
packages/core/dist/error-tracking/parsers/opera.mjs 746 B 0 B
packages/core/dist/error-tracking/parsers/safari.js 1.88 kB 0 B
packages/core/dist/error-tracking/parsers/safari.mjs 574 B 0 B
packages/core/dist/error-tracking/parsers/winjs.js 1.72 kB 0 B
packages/core/dist/error-tracking/parsers/winjs.mjs 426 B 0 B
packages/core/dist/error-tracking/types.js 1.33 kB 0 B
packages/core/dist/error-tracking/types.mjs 131 B 0 B
packages/core/dist/error-tracking/utils.js 1.8 kB 0 B
packages/core/dist/error-tracking/utils.mjs 604 B 0 B
packages/core/dist/eventemitter.js 1.78 kB 0 B
packages/core/dist/eventemitter.mjs 571 B 0 B
packages/core/dist/featureFlagUtils.js 6.5 kB 0 B
packages/core/dist/featureFlagUtils.mjs 4.28 kB 0 B
packages/core/dist/gzip.js 1.88 kB 0 B
packages/core/dist/gzip.mjs 577 B 0 B
packages/core/dist/index.js 5.7 kB 0 B
packages/core/dist/index.mjs 485 B 0 B
packages/core/dist/posthog-core-stateless.js 29.6 kB 0 B
packages/core/dist/posthog-core-stateless.mjs 27 kB 0 B
packages/core/dist/posthog-core.js 28 kB 0 B
packages/core/dist/posthog-core.mjs 24 kB 0 B
packages/core/dist/process/index.js 2.77 kB 0 B
packages/core/dist/process/index.mjs 114 B 0 B
packages/core/dist/process/spawn-local.js 1.82 kB 0 B
packages/core/dist/process/spawn-local.mjs 568 B 0 B
packages/core/dist/process/utils.js 3.12 kB 0 B
packages/core/dist/process/utils.mjs 1.15 kB 0 B
packages/core/dist/testing/index.js 2.93 kB 0 B
packages/core/dist/testing/index.mjs 79 B 0 B
packages/core/dist/testing/PostHogCoreTestClient.js 3.15 kB 0 B
packages/core/dist/testing/PostHogCoreTestClient.mjs 1.74 kB 0 B
packages/core/dist/testing/test-utils.js 2.77 kB 0 B
packages/core/dist/testing/test-utils.mjs 1.09 kB 0 B
packages/core/dist/types.js 8.2 kB 0 B
packages/core/dist/types.mjs 5.93 kB 0 B
packages/core/dist/utils/bot-detection.js 3.28 kB 0 B
packages/core/dist/utils/bot-detection.mjs 1.95 kB 0 B
packages/core/dist/utils/bucketed-rate-limiter.js 3 kB 0 B
packages/core/dist/utils/bucketed-rate-limiter.mjs 1.62 kB 0 B
packages/core/dist/utils/index.js 11 kB 0 B
packages/core/dist/utils/index.mjs 1.94 kB 0 B
packages/core/dist/utils/logger.js 2.5 kB 0 B
packages/core/dist/utils/logger.mjs 1.22 kB 0 B
packages/core/dist/utils/number-utils.js 2 kB 0 B
packages/core/dist/utils/number-utils.mjs 735 B 0 B
packages/core/dist/utils/promise-queue.js 2 kB 0 B
packages/core/dist/utils/promise-queue.mjs 768 B 0 B
packages/core/dist/utils/string-utils.js 1.91 kB 0 B
packages/core/dist/utils/string-utils.mjs 414 B 0 B
packages/core/dist/utils/type-utils.js 6.93 kB 0 B
packages/core/dist/utils/type-utils.mjs 3.03 kB 0 B
packages/core/dist/vendor/uuidv7.js 8.29 kB 0 B
packages/core/dist/vendor/uuidv7.mjs 6.72 kB 0 B
packages/nextjs-config/dist/config.js 4.54 kB 0 B
packages/nextjs-config/dist/config.mjs 3.06 kB 0 B
packages/nextjs-config/dist/index.js 2.24 kB 0 B
packages/nextjs-config/dist/index.mjs 30 B 0 B
packages/nextjs-config/dist/utils.js 3.83 kB 0 B
packages/nextjs-config/dist/utils.mjs 1.72 kB 0 B
packages/node/dist/client.js 23.2 kB 0 B
packages/node/dist/client.mjs 21.3 kB 0 B
packages/node/dist/entrypoints/index.edge.js 4.22 kB 0 B
packages/node/dist/entrypoints/index.edge.mjs 696 B 0 B
packages/node/dist/entrypoints/index.node.js 5.16 kB 0 B
packages/node/dist/entrypoints/index.node.mjs 945 B 0 B
packages/node/dist/experimental.js 603 B 0 B
packages/node/dist/experimental.mjs 0 B 0 B 🆕
packages/node/dist/exports.js 3.6 kB 0 B
packages/node/dist/exports.mjs 124 B 0 B
packages/node/dist/extensions/error-tracking/autocapture.js 2.65 kB 0 B
packages/node/dist/extensions/error-tracking/autocapture.mjs 1.23 kB 0 B
packages/node/dist/extensions/error-tracking/index.js 3.88 kB 0 B
packages/node/dist/extensions/error-tracking/index.mjs 2.61 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.js 8.81 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.mjs 7.15 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/module.node.js 2.78 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/module.node.mjs 1.45 kB 0 B
packages/node/dist/extensions/express.js 2.75 kB 0 B
packages/node/dist/extensions/express.mjs 1.16 kB 0 B
packages/node/dist/extensions/feature-flags/cache.js 603 B 0 B
packages/node/dist/extensions/feature-flags/cache.mjs 0 B 0 B 🆕
packages/node/dist/extensions/feature-flags/crypto.js 1.57 kB 0 B
packages/node/dist/extensions/feature-flags/crypto.mjs 395 B 0 B
packages/node/dist/extensions/feature-flags/feature-flags.js 30.4 kB 0 B
packages/node/dist/extensions/feature-flags/feature-flags.mjs 28.4 kB 0 B
packages/node/dist/extensions/sentry-integration.js 4.66 kB 0 B
packages/node/dist/extensions/sentry-integration.mjs 3.17 kB 0 B
packages/node/dist/storage-memory.js 1.52 kB 0 B
packages/node/dist/storage-memory.mjs 297 B 0 B
packages/node/dist/types.js 603 B 0 B
packages/node/dist/types.mjs 0 B 0 B 🆕
packages/node/dist/version.js 1.21 kB 0 B
packages/node/dist/version.mjs 46 B 0 B
packages/nuxt/dist/module.mjs 4.19 kB 0 B
packages/nuxt/dist/runtime/nitro-plugin.js 1.08 kB 0 B
packages/nuxt/dist/runtime/vue-plugin.js 1.14 kB 0 B
packages/react-native/dist/autocapture.js 4.68 kB 0 B
packages/react-native/dist/error-tracking/index.js 6.77 kB 0 B
packages/react-native/dist/error-tracking/utils.js 2.58 kB 0 B
packages/react-native/dist/frameworks/wix-navigation.js 1.3 kB 0 B
packages/react-native/dist/hooks/useFeatureFlag.js 1.49 kB 0 B
packages/react-native/dist/hooks/useFeatureFlags.js 821 B 0 B
packages/react-native/dist/hooks/useNavigationTracker.js 2.46 kB 0 B
packages/react-native/dist/hooks/usePostHog.js 467 B 0 B
packages/react-native/dist/index.js 3.12 kB 0 B
packages/react-native/dist/native-deps.js 13 kB 0 B
packages/react-native/dist/optional/OptionalAsyncStorage.js 299 B 0 B
packages/react-native/dist/optional/OptionalExpoApplication.js 377 B 0 B
packages/react-native/dist/optional/OptionalExpoDevice.js 347 B 0 B
packages/react-native/dist/optional/OptionalExpoFileSystem.js 386 B 0 B
packages/react-native/dist/optional/OptionalExpoFileSystemLegacy.js 423 B 0 B
packages/react-native/dist/optional/OptionalExpoLocalization.js 383 B 0 B
packages/react-native/dist/optional/OptionalReactNativeDeviceInfo.js 415 B 0 B
packages/react-native/dist/optional/OptionalReactNativeLocalize.js 303 B 0 B
packages/react-native/dist/optional/OptionalReactNativeNavigation.js 415 B 0 B
packages/react-native/dist/optional/OptionalReactNativeNavigationWix.js 443 B 0 B
packages/react-native/dist/optional/OptionalReactNativeSafeArea.js 644 B 0 B
packages/react-native/dist/optional/OptionalSessionReplay.js 455 B 0 B
packages/react-native/dist/posthog-rn.js 36.1 kB 0 B
packages/react-native/dist/PostHogContext.js 329 B 0 B
packages/react-native/dist/PostHogProvider.js 4.77 kB 0 B
packages/react-native/dist/storage.js 3.39 kB 0 B
packages/react-native/dist/surveys/components/BottomSection.js 1.34 kB 0 B
packages/react-native/dist/surveys/components/Cancel.js 909 B 0 B
packages/react-native/dist/surveys/components/ConfirmationMessage.js 1.58 kB 0 B
packages/react-native/dist/surveys/components/QuestionHeader.js 1.11 kB 0 B
packages/react-native/dist/surveys/components/QuestionTypes.js 10.1 kB 0 B
packages/react-native/dist/surveys/components/SurveyModal.js 3.86 kB 0 B
packages/react-native/dist/surveys/components/Surveys.js 7.18 kB 0 B
packages/react-native/dist/surveys/getActiveMatchingSurveys.js 3.69 kB 0 B
packages/react-native/dist/surveys/icons.js 7.76 kB 0 B
packages/react-native/dist/surveys/index.js 600 B 0 B
packages/react-native/dist/surveys/PostHogSurveyProvider.js 5.66 kB 0 B
packages/react-native/dist/surveys/surveys-utils.js 9.31 kB 0 B
packages/react-native/dist/surveys/useActivatedSurveys.js 3.38 kB 0 B
packages/react-native/dist/surveys/useSurveyStorage.js 2.16 kB 0 B
packages/react-native/dist/tooling/expoconfig.js 2.63 kB 0 B
packages/react-native/dist/tooling/metroconfig.js 2.2 kB 0 B
packages/react-native/dist/tooling/posthogMetroSerializer.js 10.3 kB 0 B
packages/react-native/dist/tooling/utils.js 4.05 kB 0 B
packages/react-native/dist/tooling/vendor/expo/expoconfig.js 70 B 0 B
packages/react-native/dist/tooling/vendor/metro/countLines.js 237 B 0 B
packages/react-native/dist/tooling/vendor/metro/utils.js 3.35 kB 0 B
packages/react-native/dist/types.js 70 B 0 B
packages/react-native/dist/utils.js 539 B 0 B
packages/react-native/dist/version.js 130 B 0 B
packages/react/dist/esm/index.js 18.8 kB 0 B
packages/react/dist/umd/index.js 21.9 kB 0 B
packages/rollup-plugin/dist/index.js 3.61 kB 0 B
packages/web/dist/index.cjs 13.8 kB 0 B
packages/web/dist/index.mjs 13.7 kB 0 B
packages/webpack-plugin/dist/config.js 2.65 kB 0 B
packages/webpack-plugin/dist/config.mjs 1.64 kB 0 B
packages/webpack-plugin/dist/index.js 5.83 kB 0 B
packages/webpack-plugin/dist/index.mjs 2.73 kB 0 B
tooling/changelog/dist/index.js 3.31 kB 0 B
tooling/rollup-utils/dist/index.js 1.17 kB 0 B

compressed-size-action

export function getAugmentPropertiesFromElement(elem: Element): Properties {
const shouldCaptureEl = shouldCaptureElement(elem)
if (!shouldCaptureEl) {
if (isExplicitNoCapture(elem)) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

basically, let ph-no-capture take precedence here. But otherwise if a user explicitly sets an attribute on an element then we should capture it as a property on the event.

/*
* Check whether a DOM event should be "captured" or if it may contain sensitive data
* using a variety of heuristics.
* Check whether a DOM event should be "captured" using a variety of heuristics.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wasn't really checking for sensitive data

expect(getSafeText(el)).toBe(`Mixed "double" and 'single' quotes`)
})

it(`should collect text from sensitive elements with ph-include class`, () => {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adding tests for a couple of cases we weren't really checking

Comment on lines -358 to -380
// don't include hidden or password fields
const type = (el as HTMLInputElement).type || ''
if (isString(type)) {
// it's possible for el.type to be a DOM element if el is a form with a child input[name="type"]
switch (type.toLowerCase()) {
case 'hidden':
return false
case 'password':
return false
}
}

// filter out data from fields that look like sensitive fields
const name = (el as HTMLInputElement).name || el.id || ''
// See https://github.com/posthog/posthog-js/issues/165
// Under specific circumstances a bug caused .replace to be called on a DOM element
// instead of a string, removing the element from the page. Ensure this issue is mitigated.
if (isString(name)) {
// it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name="name"]
const sensitiveNameRegex =
/^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i
if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {
return false
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have a more broader scope (i.e. safer) check for all of this in isSensitiveElement

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one thing we'll need to consider here is whether we're introducing breaking behaviour

if someone is relying on old behaviour for PII avoidance we need to be sure they're still not capturing

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's a bit of a dilemma because I think the current behavior is broken anyway, meaning that in some cases we'd still capture sensitive data even when defended elsewhere by shouldCaptureElement. I still need to test a bit more to confirm exactly what conditions the current 'gap' happens under. But knowing it's broken in at least some cases already, this leaves us with a couple of options:

  • fix the bug that could leak sensitive data based on the previous implementation
  • just remove the previous implementation and try to have one path for sensitive data identification/capture going forwards (and don't rely on fuzzy heuristics like looking for suspect sub-strings in element id/name attributes!)
  • something else I'm missing...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the joy of a public API in an SDK :)


if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {
if (
(isExplicitCapture(el) || (!isExplicitNoCapture(el) && !isSensitiveElement(el))) &&
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see note below too, but the checks we removed from shouldCaptureElement are covered more broadly inside isSensitiveElement

Comment on lines +375 to +386
it(`should return true for elements with class "ph-include"`, () => {
const el = document!.createElement(`div`)
el.className = `test1 ph-include test2`
expect(isExplicitCapture(el)).toBe(true)
})

it(`should return false for elements without class "ph-include"`, () => {
const el = document!.createElement(`div`)
el.className = `test1 test2`
expect(isExplicitCapture(el)).toBe(false)
})
})
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we actually don't document ph-include anymore as far as I can see, but keeping it around for backward compatibility

Comment on lines -401 to -428
it(`should not include fields with sensitive names`, () => {
const sensitiveNames = [
`cc_name`,
`card-num`,
`ccnum`,
`credit-card_number`,
`credit_card[number]`,
`csc num`,
`CVC`,
`Expiration`,
`password`,
`pwd`,
`routing`,
`routing-number`,
`security code`,
`seccode`,
`security number`,
`social sec`,
`SsN`,
]
sensitiveNames.forEach((name) => {
input.name = ''
expect(shouldCaptureElement(input)).toBe(true)

input.name = name
expect(shouldCaptureElement(input)).toBe(false)
})
})
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was in some ways redundant because we'd still capture the element with sensitive names inside elements_chain

it('should collect augment from the hidden element value', () => {
const props = getAugmentPropertiesFromElement(hidden)

expect(props).toStrictEqual({ 'on-the-hidden': 'is on the hidden' })
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if a user has added a data-ph-capture-attribute attribute, then we should take that as explicit opt-in that they want the attribute captured - same for tests below

const elTarget = document.createElement('span')
const elAnchor = document.createElement('a')
elAnchor.appendChild(elTarget)
elAnchor.setAttribute('id', 'password')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this probably would have failed before because of the checks inside shouldCaptureElement on 'sensitive names'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants