Regex DSN Sentry (Data Source Name)
Un DSN Sentry s'écrit {PROTOCOLE}://{CLÉ_PUBLIQUE}:{CLÉ_SECRÈTE}@{HÔTE}{CHEMIN}/{ID_PROJET}. La clé secrète est facultative et quasi abandonnée, l'identifiant de projet est un entier. Sentry publie deux motifs : SaaS (https://[a-f0-9]{32}@o\d+\.ingest(\.[a-z]+)?\.sentry\.io/\d+) et auto-hébergé ou Relay (https?://[a-f0-9]{32}@[^/]+/\d+), mais l'exemple de la documentation des SDK (https://public@sentry.example.com/1) a une clé de 6 lettres. Le motif du SDK JavaScript laisse la validation à un code ultérieur : seul, il accepte « ftp:// » et un projet « abc ». Voici un motif ancré qui accepte les deux familles, comparé à ces trois-là. Un DSN n'est pas un secret.
/^https?://\w+(?::\w+)?@(?:\[[:.%\w]+\]|[\w.-]+)(?::\d+)?(?:/[\w.-]+)*/\d+$/passe 23/23 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Sentry, documentation (SaaS) — réservé à *.ingest.sentry.io : un DSN auto-hébergé est rejeté ; https seulement | https://[a-f0-9]{32}@o\d+\.ingest(\.[a-z]+)?\.sentry\.io/\d+ | 17 / 23 | sûr |
| Sentry, documentation (auto-hébergé et Relay) — impose 32 hexadécimaux : l'exemple « https://public@sentry.example.com/1 » de la documentation des SDK est rejeté | https?://[a-f0-9]{32}@[^/]+/\d+ | 17 / 23 | sûr |
| sentry-javascript (DSN_REGEX) — protocole libre (« ftp:// ») et projet « (.+) » : « …/abc » passe, la validation numérique étant faite plus loin dans le code ; un « / » final ou « 1abc » passent aussi | ^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)((?:\[[:.%\w]+\]|[\w.-]+))(?::(\d+))?\/(.+) | 18 / 23 | sûr |
Implémentation
const re = new RegExp("^https?://\\w+(?::\\w+)?@(?:\\[[:.%\\w]+\\]|[\\w.-]+)(?::\\d+)?(?:/[\\w.-]+)*/\\d+$", "");
re.test(input);Limites
- Valide seulement la FORME : ne prouve pas que le projet existe ni que la clé est active. Pas de contrôle du nombre de chiffres de l'identifiant, ni du format de 32 hexadécimaux que la page de formats de jetons indique pour la clé : le motif accepte tout mot (\w+), comme le SDK, car la documentation donne elle-même « public » en exemple.
- L'hôte est accepté dès qu'il est composé de lettres, chiffres, tirets et points (ou d'une adresse IPv6 entre crochets) : le motif ne vérifie ni le domaine ni le format *.ingest.sentry.io, et le port n'est pas borné à 65535.
- Un DSN n'est pas un secret (il ne permet que d'envoyer des événements) : ne le confondez pas avec les jetons d'authentification Sentry (sntryu_…, sntrys_…), un autre format.