Your WAF, SIEM, and EDR watch the server, network, and endpoints. None of them see what executes in the browser. Report URI turns that blind spot into telemetry you can detect and respond to.
Your detection coverage is good where your tools look. The WAF sees requests to origin. The SIEM correlates server-side logs. EDR watches the endpoint.
None of them see what executes in the browser after the page loads. Magecart exfiltration goes straight from the user's browser to attacker infrastructure — it never crosses a boundary your tooling inspects. The server logs look normal. The alert never fires, because nothing is watching the layer where it happened.
That's not a tuning problem. It's a source you're not collecting from.
The browser will tell you what's happening in it — through native reporting, not injected code.
CSP Reporting
Every policy violation from real browsers: attempted injections, unauthorised script loads, blocked sources. Detection events your SIEM never receives today. See how CSP reporting works →
Script Watch
Change detection on every JavaScript dependency. A script that changes, moves, or starts behaving differently in an authenticated session is a reliable indicator of a client-side compromise in progress. See how Script Watch monitors your JavaScript →
Data Watch
Data leaving the page to destinations it shouldn't reach. The exfiltration signal, at the point it happens. See how Data Watch tracks your data →
These are feeds you can route, review, and build response around.
The metric that matters is how long hostile code executes before you catch it.
The Instructure Canvas breach is the case study: a stored-XSS payload ran in an authenticated session and exposed 275 million student records. With a strict CSP, that injection generated a violation report on every page load. As Report URI's founder Scott Helme documented, the signal existed for four days — the reports just weren't going anywhere anyone watched.
CSP violation reporting is, in effect, a real-time integrity sensor for your execution environment.
Detection drops from days to the first page load — if the reports land where your team already looks.
You've onboarded feeds that turned into noise nobody triaged. The concern is fair.
Policy-based enforcement is what keeps this clean: you define what's allowed, so a violation is a real deviation from policy — not ambient event volume. A useful alert means something actually broke a rule you set.
This is designed to land in your workflow as signal you can act on, not a fourth dashboard to babysit.
Report URI works through the browser's Reporting API. Add your reporting endpoint to your Content-Security-Policy header. That's the deployment.
Content-Security-Policy: default-src 'self';
report-uri https://your-subdomain.report-uri.com/r/d/csp/enforce
Browser-native. No agent, no proxy in the path, no code changes — and nothing new to fail an availability review. The site is unaffected if Report URI is unavailable.
| Pairs with | Doesn't replace |
|---|---|
| Your WAF | Penetration testing |
| Your SIEM | Secure code review |
| Your SOC | Framework-level XSS defence |
It doesn't replace what you run. It feeds the layer they can't see — telling you when a control has already been bypassed, before the session or the data is gone. The full guide to client-side security →
Have I Been Pwned runs Report URI to monitor for malicious JavaScript and unauthorised data exfiltration — treating the browser as a detection surface, not a display layer.
Report URI was founded by Scott Helme, who finds and publicly discloses client-side attacks from real CSP report data — the Canvas breach dwell-time analysis and live Magecart campaigns among them. Read the case studies →
One header. No agent, no proxy.