Original data on what the web actually does about client-side security.
We help organisations see and control what runs in their users' browsers. This section is the evidence behind that. We crawl the top million sites, and we read the live policies of the organisations getting client-side security right, so what we build and what we recommend come from what's measurably working rather than from what sounds sensible.
The top 1 million sites, crawled every day since 2016. Ten years of that data shows a consistent split: the controls an infrastructure provider can switch on for you improved steadily, and the ones needing somebody to go back and finish the configuration did not. CSP adoption grew more than 12,000% over the decade — and 46.8% of those policies still carry unsafe-inline.
Gmail, YouTube, Cloud Console, Google Drive, Adyen, PayPal, American Express and GitHub all enforce a Content Security Policy. This is what their live headers say, how to re-check them yourself, and what the migration did to Google's XSS rate — from 30% of vulnerability reward payouts in 2018 to 4.1% in 2023.
Four posts from a Dropbox security engineer in 2015 on getting a Content Security Policy into production — including the report noise that nearly stopped them, and the three-stage filter they had to build before the reports were readable. The policy is still in their headers to this very day.
Their first policy, in 2013, contained default-src * — and GitHub still credit it with substantially reducing XSS risk. Three years of public tightening later they removed even their own origin from script-src, then published a whole post on what CSP could not stop, closed those gaps, and kept the policy.
In 2013 they published why the policy was running on every property except the front page: a wealth of inline JavaScript in one of their oldest projects. That is the objection most teams stop at. Today x.com sends a nonce and forbids inline event handlers outright — the exact thing that was blocking them.
The only rollout in this research carried out entirely in public: the decision record that proposed it, the developer manual, the shared library the policy lives in, and the header it produces. They moved to enforce in Summer 2023 — and wrote down that the volume of false positives nearly cost them the reporting.
The single sign-on service for US federal services runs the cleanest policy in this research — no unsafe-inline, no unsafe-eval, nonces on both scripts and styles. And because it is built in the open, you can read the policy source and every change ever made to it rather than inferring it from a header.
The work here keeps arriving at the same finding from different directions: a security control is only worth what you know about it once it is live. Deploying one is the easy half, and the half most of the web has done. Knowing it is still doing its job — that nothing changed, that nothing new appeared, that the policy still says what you think it says — is the half that needs somebody watching.
That watching is what we run. See how CSP reporting works →