Skip to content

Commit 26e6a22

Browse files
committed
Add option to drop scrubbed user IP addresses
1 parent 4a56e34 commit 26e6a22

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

sentry_sdk/scrubber.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def __init__(
6666
recursive: bool = False,
6767
send_default_pii: bool = False,
6868
pii_denylist: "Optional[List[str]]" = None,
69+
remove_user_ip_address: bool = False,
6970
) -> None:
7071
"""
7172
A scrubber that goes through the event payload and removes sensitive data configured through denylists.
@@ -74,6 +75,7 @@ def __init__(
7475
:param recursive: Whether to scrub the event payload recursively, default False.
7576
:param send_default_pii: Whether pii is sending is on, pii fields are not scrubbed.
7677
:param pii_denylist: The denylist to use for scrubbing when pii is not sent, defaults to DEFAULT_PII_DENYLIST.
78+
:param remove_user_ip_address: Whether to remove ``user.ip_address`` instead of replacing it with ``[Filtered]``.
7779
"""
7880
self.denylist = DEFAULT_DENYLIST.copy() if denylist is None else denylist
7981

@@ -85,6 +87,7 @@ def __init__(
8587

8688
self.denylist = [x.lower() for x in self.denylist]
8789
self.recursive = recursive
90+
self.remove_user_ip_address = remove_user_ip_address
8891

8992
def scrub_list(self, lst: object) -> None:
9093
"""
@@ -137,7 +140,14 @@ def scrub_extra(self, event: "Event") -> None:
137140
def scrub_user(self, event: "Event") -> None:
138141
with capture_internal_exceptions():
139142
if "user" in event:
140-
self.scrub_dict(event["user"])
143+
user = event["user"]
144+
if (
145+
self.remove_user_ip_address
146+
and "ip_address" in self.denylist
147+
and isinstance(user, dict)
148+
):
149+
user.pop("ip_address", None)
150+
self.scrub_dict(user)
141151

142152
def scrub_breadcrumbs(self, event: "Event") -> None:
143153
with capture_internal_exceptions():

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_scrubbed_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", "ip_address": "[Filtered]"}
107+
assert event["_meta"]["user"] == {"ip_address": {"": {"rem": [["!config", "s"]]}}}
108+
109+
110+
def test_user_ip_address_removed_when_configured(sentry_init, capture_events):
111+
sentry_init(event_scrubber=EventScrubber(remove_user_ip_address=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"}
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)