`EventScrubber` doesn't scrub a request body that's a top level JSON array
Les mainteneurs répondent en général sous 1 jour
@Om-singhaI y travaille déjà.
Depuis le 21/9/2026.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
Piste de recherche
Reproduisez le problème avec le repro.py fourni, puis examinez EventScrubber.scrub_request, scrub_dict et scrub_list pour suivre la manière dont les données de la requête sont traitées. Utilisez les tests existants du scrubber ou ajoutez une couverture pour un tableau de niveau supérieur ; le travail est terminé lorsque les valeurs imbriquées de password ou api_key sont filtrées dans les corps de tableaux comme elles le sont dans les corps d’objets.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
How do you use Sentry?
Sentry Saas (sentry.io)
Version
2.69.2 (also on master at 494ecb3)
Steps to Reproduce
When a request body parses to a top level JSON array, nothing in it gets scrubbed. The same secrets in an object body are filtered normally. No event_scrubber argument, no _experiments data collection config, default max_request_body_size. The integration and the transport in the snippet are only there to catch the event.
A top level array is the usual shape for a bulk endpoint, something like POST /api/v1/users/bulk with a list of records. If those records carry a password or an api_key, they leave the process in the clear. A team that spot checks a single object endpoint sees scrubbing work fine, so there's nothing to tip them off.
Python 3.13.15, Flask 3.1.3, sentry-sdk 2.69.2. Save this as repro.py and run it.
import json
import logging
import sentry_sdk
from flask import Flask
from sentry_sdk.integrations.flask import FlaskIntegration
events = []
class Capture(sentry_sdk.transport.Transport):
def capture_envelope(self, envelope):
for item in envelope.items:
if item.headers.get("type") == "event":
events.append(item.payload.json)
sentry_sdk.init(
dsn="https://[email protected]/1",
integrations=[FlaskIntegration()],
transport=Capture(),
)
app = Flask(__name__)
app.logger.disabled = True
logging.getLogger("werkzeug").disabled = True
@app.route("/bulk", methods=["POST"])
def bulk():
raise ValueError("boom")
@app.route("/single", methods=["POST"])
def single():
raise ValueError("boom")
client = app.test_client()
client.post("/bulk", json=[{"user": "a", "password": "hunter2"}])
client.post("/single", json={"user": "a", "password": "hunter2"})
sentry_sdk.get_client().close()
print("array body :", json.dumps(events[0]["request"]["data"]))
print("object body:", json.dumps(events[1]["request"]["data"]))
Expected Result
The array body should come out filtered the same way the object body does:
array body : [{"password": "[Filtered]", "user": "a"}]
object body: {"password": "[Filtered]", "user": "a"}
Actual Result
array body : [{"password": "hunter2", "user": "a"}]
object body: {"password": "[Filtered]", "user": "a"}
EventScrubber.scrub_request calls scrub_dict on event["request"]["data"], and scrub_dict returns immediately when what it's given isn't a dict, so a list body stops scrubbing before it starts. The class already ships scrub_list, whose docstring says it walks a list and any nested lists and calls scrub_dict on every dictionary it finds, but it's never called on the request body.
This is separate from #7542, which is about how denylist keys are matched. Here the keys never get looked at at all. I have a fix and tests ready if you want a PR.
- Langage dominant
- Python
- Étoiles
- 2.2k
- Forks
- 680
- Merge moyen
- 1 j 1 h
- PR mergées (30 j)
- 267
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de getsentry/sentry-python
-
Bug Python Waiting for: Product Owner
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
getsentry/sentry-python#7827 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Bug Python
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
getsentry/sentry-python#7774 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Remove send_default_pii from rayOuvertePython Task
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
getsentry/sentry-python#7663 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Python Task
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
getsentry/sentry-python#7652 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
Remove send_default_pii from httpxPeut-être pris @sentrivana l’a pris il y a 8 jours. OuvertePython
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
getsentry/sentry-python#7653 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de getsentry/sentry-python
Issues similaires
-
good first issue hacktoberfest
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
RogueAlg0/taken#387 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
tool-calling
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
vllm-project/vllm#59838 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
raullenchai/Rapid-MLX#4042 ·
Les mainteneurs répondent en général sous 1 jour
-
documentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
transitmatters/mbta-slow-zone-bot#70 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
open-webui/open-webui#31871 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour