CSPViolationReportBody: documentURL 属性

documentURLCSPViolationReportBody 接口的一个只读属性,它是一个字符串,表示违反 内容安全策略 (CSP) 的文档或 worker 的 URL。

一个包含违反 CSP 的文档或 worker 的 URL 的字符串。

示例

CSP 内联脚本违规显示引荐来源

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

HTML

首先,我们定义我们的引荐来源页面 /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-elem 设置为 self,这允许从同一域加载脚本,但不允许执行内联脚本。该文档还包含一个内联脚本,这将触发 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-documenturl

浏览器兼容性

另见