Skip to content

Commit 7a303dc

Browse files
authored
Add option to drop scrubbed user IP addresses (#6241)
Fixes #5701 by adding an EventScrubber option to remove `user.ip_address` instead of replacing it with `[Filtered]`. This avoids emitting `[Filtered]` in a field Relay expects to be a valid IP address, while preserving the existing default behavior for backward compatibility. By default, `user.ip_address` is still scrubbed through the normal scrubber path and keeps the `_meta` annotation. --------- Co-authored-by: Julio César Suástegui <juliosuas@users.noreply.github.com>
1 parent edaa6d6 commit 7a303dc

3 files changed

Lines changed: 40 additions & 5 deletions

File tree

sentry_sdk/scrubber.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ def scrub_extra(self, event: "Event") -> None:
137137
def scrub_user(self, event: "Event") -> None:
138138
with capture_internal_exceptions():
139139
if "user" in event:
140-
self.scrub_dict(event["user"])
140+
user = event["user"]
141+
if "ip_address" in self.denylist and isinstance(user, dict):
142+
user.pop("ip_address", None)
143+
self.scrub_dict(user)
141144

142145
def scrub_breadcrumbs(self, event: "Event") -> None:
143146
with capture_internal_exceptions():

tests/new_scopes_compat/test_new_scopes_compat_event.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ def create_expected_error_event(trx, span):
102102
"user": {
103103
"id": "123",
104104
"email": "jane.doe@example.com",
105-
"ip_address": "[Filtered]",
106105
},
107106
"transaction": "test_transaction",
108107
"transaction_info": {"source": "custom"},
@@ -137,7 +136,6 @@ def create_expected_error_event(trx, span):
137136
},
138137
"platform": "python",
139138
"_meta": {
140-
"user": {"ip_address": {"": {"rem": [["!config", "s"]]}}},
141139
"extra": {
142140
"should_be_removed_by_event_scrubber": {
143141
"": {"rem": [["!config", "s"]]}
@@ -207,7 +205,6 @@ def create_expected_transaction_event(trx, span):
207205
"user": {
208206
"id": "123",
209207
"email": "jane.doe@example.com",
210-
"ip_address": "[Filtered]",
211208
},
212209
"extra": {
213210
"extra1": "extra1_value",
@@ -226,7 +223,6 @@ def create_expected_transaction_event(trx, span):
226223
},
227224
"platform": "python",
228225
"_meta": {
229-
"user": {"ip_address": {"": {"rem": [["!config", "s"]]}}},
230226
"extra": {
231227
"should_be_removed_by_event_scrubber": {
232228
"": {"rem": [["!config", "s"]]}

tests/test_scrubber.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,42 @@ def test_ip_address_not_scrubbed_when_pii_enabled(sentry_init, capture_events):
8989
}
9090

9191

92+
def test_user_ip_address_removed_when_pii_disabled(sentry_init, capture_events):
93+
sentry_init()
94+
events = capture_events()
95+
96+
try:
97+
1 / 0
98+
except ZeroDivisionError:
99+
ev, _hint = event_from_exception(sys.exc_info())
100+
ev["user"] = {"id": "42", "ip_address": "127.0.0.1"}
101+
102+
capture_event(ev)
103+
104+
(event,) = events
105+
106+
assert event["user"] == {"id": "42"}
107+
assert "user" not in event.get("_meta", {})
108+
109+
110+
def test_user_ip_address_not_removed_when_pii_enabled(sentry_init, capture_events):
111+
sentry_init(send_default_pii=True)
112+
events = capture_events()
113+
114+
try:
115+
1 / 0
116+
except ZeroDivisionError:
117+
ev, _hint = event_from_exception(sys.exc_info())
118+
ev["user"] = {"id": "42", "ip_address": "127.0.0.1"}
119+
120+
capture_event(ev)
121+
122+
(event,) = events
123+
124+
assert event["user"] == {"id": "42", "ip_address": "127.0.0.1"}
125+
assert "user" not in event.get("_meta", {})
126+
127+
92128
def test_stack_var_scrubbing(sentry_init, capture_events):
93129
sentry_init()
94130
events = capture_events()

0 commit comments

Comments
 (0)