Referrer-Policy & Permissions-Policy Checker

Sends one real HTTP GET request to a URL you choose and classifies the response's Referrer-Policy and Permissions-Policy headers into well-documented misconfiguration patterns: unsafe-url leaking the full URL on every request (even a downgrade), a missing or unrecognised Referrer-Policy, a Permissions-Policy directive with a malformed allowlist, and a wildcard allowlist on a sensitive feature like camera or microphone. Only point it at a system you own or are authorised to test.

1. Run the CLI against your site

Node.js, no dependencies to install:

node check.mjs https://example.com --json

Get check.mjs, probe.mjs, and analyze.mjs from the repo — plain Node, nothing to install. It only ever talks to the URL you pass; nothing goes through this site.

2. Paste the JSON output here

Paste the JSON from step 1 and click Check.

Common questions

Why is Referrer-Policy: unsafe-url dangerous?

unsafe-url sends the document's full URL -- including its path and query string -- as the Referer header on every outbound request this page makes, including a request that downgrades from HTTPS to plain HTTP. A query string carrying a session token, a password-reset code, or any other sensitive value is then readable by every third-party resource the page loads and by anyone who can observe that HTTP request in transit.

What happens if a Referrer-Policy value isn't recognised?

A conforming browser treats an unrecognised token as if that entry were absent. If none of the comma-separated values in the header is a real policy token, the header has no effect at all -- the browser silently falls back to its own default policy, with nothing in the response to say so.

How does a Permissions-Policy allowlist have to be written?

Per the Permissions Policy spec's structured-header-based syntax, a directive's value is either the bare wildcard *, or a parenthesised list whose items are self, src, or a double-quoted origin string -- for example camera=(self) or geolocation=(self "https://example.com"). A bare, unparenthesised origin, an unquoted origin inside the parens, or unbalanced parentheses does not match that shape, and browsers do not all handle a malformed directive the same way.

Why flag a wildcard allowlist on camera or microphone?

A wildcard (*) allowlist on a sensitive feature grants that capability to every origin the document ever embeds as an iframe, not just to the site's own origin. A third-party ad, widget, or analytics iframe added later inherits the same access automatically, with no further change to this header -- an explicit allowlist naming only the origins that should have it avoids that quiet expansion.

Does a clean report mean the site's privacy and permissions posture is fully correct?

No. This checks a specific, well-documented set of Referrer-Policy and Permissions-Policy patterns from one response -- it is not a full privacy or security audit, does not crawl other pages on the site, and cannot see a misconfiguration this tool's checks don't happen to cover (Content-Security-Policy and frame-ancestors are out of scope here -- see security-headers-check for those). Treat a clean report as evidence about these specific patterns, not a determination that the site's privacy posture is optimal.