CSPViolationReportBody: referrer 属性

CSPViolationReportBody 接口的只读属性 referrer 是一个字符串,表示资源(其 Content Security Policy (CSP) 被违反)的引用页面的 URL。

Referrer 是导致 CSP 违规页面加载的那个页面。例如,如果我们点击一个链接进入一个 CSP 违规页面,那么 referrer 就是我们从中导航过来的页面。

一个字符串,表示带有 CSP 违规的页面的 referrer 的 URL,或者为 null

请注意,如果 referrer 是 HTTP(S) URL,则会删除任何用户名、密码或片段。如果 URL 方案不是 http:https:,则只返回方案。

示例

显示 referrer 的 CSP 内联脚本违规

此示例使用内联脚本触发 CSP 违规,并使用 ReportingObserver 报告违规。我们从另一个页面导航到该页面,并记录 referrerdocumentURLblockedURL

HTML

首先,我们定义我们的 referrer 页面 /bounce/index.html。此页面仅包含一个指向另一个页面 ../report_sample/index.html 的链接。

html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <body>
    <ul>
      <li><a href="../report_sample/">report sample</a></li>
    </ul>
  </body>
</html>

../report_sample/index.html HTML 文件定义如下。它使用 <meta> 元素设置 Content-Security-Policyscript-src-elemself,这允许从同一域加载脚本,但不允许执行内联脚本。该文档还包含一个内联脚本,这将触发 CSP 违规。

html
<!doctype html>
<!-- /report_sample/index.html -->
<html lang="en">
  <head>
    <meta
      http-equiv="Content-Security-Policy"
      content="script-src-elem 'self' 'report-sample'" />
    <script src="main.js"></script>
  </head>
  <body>
    <script>
      const int = 4;
    </script>
  </body>
</html>

JavaScript (main.js)

上面的报告示例还加载了外部脚本 main.js,如下所示。由于这是从与 HTML 相同的域加载的,因此它不会被 CSP 阻止。

该脚本创建一个新的 ReportingObserver 来观察类型为 "csp-violation" 的内容违规报告。每次调用回调函数时,我们都会获取报告数组的第一个条目的主体,并使用它将违规的 documentURLreferrerblockedURL 记录到控制台。

js
// main.js
const observer = new ReportingObserver(
  (reports, observer) => {
    console.log(`documentURL: ${reports[0].body.referrer}`);
    console.log(`referrer: ${reports[0].body.referrer}`);
    console.log(`blockedURL: ${reports[0].body.blockedURL}`);
  },
  {
    types: ["csp-violation"],
    buffered: true,
  },
);

observer.observe();

请注意,虽然返回的数组中可能有多份报告,但为了简洁起见,我们只记录第一个元素的这些值。

结果

上述代码的控制台输出可能类似于下方(网站将取决于页面如何提供):

documentURL: http://127.0.0.1:9999/report_sample/
referrer: http://127.0.0.1:9999/bounce/
blockedURL: inline

请注意,referrer 是我们从中导航过来的页面,documentURL 是发生 CSP 违规的页面,而 blockedURL 在这种情况下不是 URL,而是表示违规是由不安全的内联脚本引起的。

规范

规范
内容安全策略级别 3
# dom-cspviolationreportbody-referrer

浏览器兼容性

另见