class EventScrubber: def __init__(
self, denylist=None, recursive=False, send_default_pii=False, pii_denylist=None
): # type: (Optional[List[str]], bool, bool, Optional[List[str]]) -> None """
A scrubber that goes through the event payload and removes sensitive data configured through denylists.
:param denylist: A security denylist that is always scrubbed, defaults to DEFAULT_DENYLIST.
:param recursive: Whether to scrub the event payload recursively, default False.
:param send_default_pii: Whether pii is sending is on, pii fields are not scrubbed.
:param pii_denylist: The denylist to use for scrubbing when pii isnot sent, defaults to DEFAULT_PII_DENYLIST. """
self.denylist = DEFAULT_DENYLIST.copy() if denylist isNoneelse denylist
self.denylist = [x.lower() for x in self.denylist]
self.recursive = recursive
def scrub_list(self, lst): # type: (object) -> None """ If a list is passed to this method, the method recursively searches the list and any
nested lists for any dictionaries. The method calls scrub_dict on all dictionaries
it finds. If the parameter passed to this method isnot a list, the method does nothing. """ ifnot isinstance(lst, list): return
for v in lst:
self.scrub_dict(v) # no-op unless v is a dict
self.scrub_list(v) # no-op unless v is a list
def scrub_dict(self, d): # type: (object) -> None """ If a dictionary is passed to this method, the method scrubs the dictionary of any
sensitive data. The method calls itself recursively on any nested dictionaries (
including dictionaries nested in lists) if self.recursive isTrue.
This method does nothing if the parameter passed to it isnot a dictionary. """ ifnot isinstance(d, dict): return
for k, v in d.items(): # The cast is needed because mypy is not smart enough to figure out that k must be a # string after the isinstance check. if isinstance(k, str) and k.lower() in self.denylist:
d[k] = AnnotatedValue.substituted_because_contains_sensitive_data() elif self.recursive:
self.scrub_dict(v) # no-op unless v is a dict
self.scrub_list(v) # no-op unless v is a list
def scrub_breadcrumbs(self, event): # type: (Event) -> None with capture_internal_exceptions(): if"breadcrumbs"in event: if ( not isinstance(event["breadcrumbs"], AnnotatedValue) and"values"in event["breadcrumbs"]
): for value in event["breadcrumbs"]["values"]: if"data"in value:
self.scrub_dict(value["data"])
def scrub_frames(self, event): # type: (Event) -> None with capture_internal_exceptions(): for frame in iter_event_frames(event): if"vars"in frame:
self.scrub_dict(frame["vars"])
def scrub_spans(self, event): # type: (Event) -> None with capture_internal_exceptions(): if"spans"in event: for span in cast(List[Dict[str, object]], event["spans"]): if"data"in span:
self.scrub_dict(span["data"])
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.