Subresource Integrity is only as complete as your discipline in applying it. Integrity Policy has the browser tell you about every eligible script that loaded without it — and, when you're ready, refuse to run them at all.
Subresource Integrity is an excellent defence: give a script tag an integrity attribute and the browser refuses to run the file if its contents no longer match. The weakness is not the mechanism, it is the coverage. Hashes are added by hand, tags are added by many teams, and a script injected by a tag manager or a third-party widget never passes through your review at all. The result on most sites is partial protection with no way of knowing where the gaps are.
A script tag with no integrity attribute loads perfectly normally. Nothing warns you, nothing fails, and no page looks different — so an omission survives review, deployment and every subsequent release without ever being noticed.
Tag managers, ad platforms and embedded widgets insert script elements at runtime. Those tags are built by somebody else's code, on somebody else's schedule, and no amount of care in your own templates puts an integrity attribute on them.
“We use SRI” is a statement about intent. Without a measurement from the browsers actually loading your pages, neither you nor an assessor can tell whether that means every eligible script or merely most of them.
One response header asks the browser to report any script that was eligible for Subresource Integrity but loaded without it. Drop the report-only suffix later and the same policy blocks them instead.
Integrity Policy reports only the genuine gaps: a script had to be eligible for SRI and to have loaded without it before an event is sent. If your coverage is already complete, nothing is reported at all — which makes an empty report a meaningful result rather than a sign that something is misconfigured.
Learn more about Integrity Policy →Start with Integrity-Policy-Report-Only and the browser tells you about unprotected scripts while continuing to run them. When the reports show the coverage you want, remove the report-only suffix and the browser refuses to load an eligible script that arrives without integrity metadata. The same header, one word shorter.
Because a report requires an actual gap, Integrity Policy is unusually quiet for a monitoring product. Scripts that already carry a hash generate nothing, and scripts that were never eligible for SRI generate nothing either — so the volume tracks the size of your problem, and shrinks as you fix it.
Learn more about Script Watch →One header. No code. Events only where a gap actually exists.
30-day free trial · One header · No code · Cancel anytime
Integrity Policy is deliberately narrow. Knowing exactly when it does and does not fire is what makes a quiet account trustworthy rather than suspicious.
| Situation | What happens |
|---|---|
| Eligible script loaded without SRI | An event is reported — this is the gap the policy exists to find |
| Script already carries an integrity attribute | Nothing is reported; the protection you wanted is in place |
| Script was never eligible for SRI | Nothing is reported; the policy does not manufacture findings |
| Header sent as Report-Only | The script still loads and runs; you are only being told |
| Header sent without Report-Only | The browser blocks the script and reports that it did |
| No gaps anywhere on the site | No events at all — a clean result, not a broken setup |
Because events are only generated by real gaps, the reporting volume tracks the size of the problem and falls away as coverage improves.
Integrity Policy is part of the Subresource Integrity specification, implemented in the browser. The browser evaluates your policy against the scripts it loads and reports over the Reporting API. Nothing of ours runs on your pages, and the coverage figure describes what real visitors received.
Start in report-only and nothing changes for your visitors. One header is the entire deployment.
Integrity-Policy-Report-Only: blocked-destinations=(script),
endpoints=(default)
Reports travel over the Reporting API, so you will also need a Report-To group pointing at your Report URI endpoint — the exact header is on your Setup page. To enforce later, send the same header as Integrity-Policy.
Requirement 6.4.3 asks that the integrity of each payment page script is assured, and the standard's guidance names Subresource Integrity as the first mechanism for doing it. Claiming SRI is straightforward; demonstrating that it covers every eligible script is the harder part. Integrity Policy produces that demonstration from the browsers loading your pages, and can enforce the requirement rather than merely describing it.
Identification of the files themselves is CSP Integrity's job, inventory is Script Watch's, and the wider evidence layer is set out on the PCI DSS Compliance page.
Integrity Policy is about whether protection is present, not about what the protected file contains. It measures and enforces SRI coverage — identifying the scripts themselves is a different job, handled alongside it.
| Integrity Policy does | Pairs with |
|---|---|
| Reports eligible scripts loaded without SRI | CSP Integrity for identification — naming the library and version behind each file |
| Blocks unprotected scripts once enforced | CSP for load control — deciding which sources may be used at all |
| Measures coverage from real sessions | Script Watch for inventory and change detection — knowing when the set of scripts moves |
| Turns intent into a demonstrable control | Threat Intelligence for IoC matching — identifying known malicious sources |
Together, these form the client-side security visibility layer that sits between your CSP policy and your incident response process.