Skip to content

Commit 6197251

Browse files
solnicclaude
andcommitted
fix(live_view_hook): Scrub sensitive params in breadcrumbs
LiveView event params, mount params, and handle_params params come from client-side input over WebSocket and may contain passwords, credit card numbers, or other sensitive data. They were previously stored verbatim in Sentry breadcrumbs, leaking to the Sentry project on any subsequent event. Apply Sentry.Scrubber.scrub_map/1 to the params at all three breadcrumb sites (on_mount, handle_event, handle_params) so that values for the default sensitive keys ('password', 'passwd', 'secret') and credit card patterns are redacted before being added to breadcrumbs. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent bea1d00 commit 6197251

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

lib/sentry/live_view_hook.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ if Code.ensure_loaded?(Phoenix.LiveView) do
6666
Context.add_breadcrumb(%{
6767
category: "web.live_view.mount",
6868
message: "Mounted live view",
69-
data: params
69+
data: Sentry.Scrubber.scrub_map(params)
7070
})
7171

7272
if uri = get_connect_info_if_root(socket, :uri) do
@@ -105,7 +105,7 @@ if Code.ensure_loaded?(Phoenix.LiveView) do
105105
Context.add_breadcrumb(%{
106106
category: "web.live_view.event",
107107
message: inspect(event),
108-
data: %{event: event, params: params}
108+
data: %{event: event, params: Sentry.Scrubber.scrub_map(params)}
109109
})
110110

111111
{:cont, socket}
@@ -127,7 +127,7 @@ if Code.ensure_loaded?(Phoenix.LiveView) do
127127
Context.add_breadcrumb(%{
128128
category: "web.live_view.params",
129129
message: "#{uri}",
130-
data: %{params: params, uri: uri}
130+
data: %{params: Sentry.Scrubber.scrub_map(params), uri: uri}
131131
})
132132

133133
{:cont, socket}

test/sentry/live_view_hook_test.exs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ defmodule SentryTest.Live do
1818
{:noreply, socket}
1919
end
2020

21+
def handle_event("login", _params, socket) do
22+
{:noreply, socket}
23+
end
24+
2125
def handle_info(:test_message, socket) do
2226
{:noreply, socket}
2327
end
@@ -164,6 +168,33 @@ defmodule Sentry.LiveViewHookTest do
164168
assert Logger.metadata() == []
165169
end
166170

171+
test "scrubs sensitive params in handle_event breadcrumb", %{conn: conn} do
172+
{:ok, view, _html} = live(conn, "/hook_test")
173+
174+
render_hook(view, :login, %{"password" => "supersecret", "username" => "alice"})
175+
176+
context = get_sentry_context(view)
177+
[event_breadcrumb | _] = context.breadcrumbs
178+
179+
assert event_breadcrumb.category == "web.live_view.event"
180+
assert event_breadcrumb.data.event == "login"
181+
assert event_breadcrumb.data.params == %{"password" => "*********", "username" => "alice"}
182+
end
183+
184+
test "scrubs sensitive params in on_mount and handle_params breadcrumbs", %{conn: conn} do
185+
{:ok, view, _html} = live(conn, "/hook_test?password=secret&username=alice")
186+
187+
context = get_sentry_context(view)
188+
189+
assert [
190+
%{category: "web.live_view.params"} = params_breadcrumb,
191+
%{category: "web.live_view.mount"} = mount_breadcrumb
192+
] = context.breadcrumbs
193+
194+
assert mount_breadcrumb.data == %{"password" => "*********", "username" => "alice"}
195+
assert params_breadcrumb.data.params == %{"password" => "*********", "username" => "alice"}
196+
end
197+
167198
defp get_sentry_context(view) do
168199
{:dictionary, pdict} = Process.info(view.pid, :dictionary)
169200

0 commit comments

Comments
 (0)