CSPViolationReportBody

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

CSPViolationReportBody 介面是 Reporting API 的一個擴充套件,用於表示內容安全策略 (CSP) 違規報告的正文。

當網頁嘗試載入違反 Content-Security-Policy HTTP 標頭設定的策略的資源時,會丟擲 CSP 違規。

CSP 違規報告會在型別為 "csp-violation"ReportingObserver 回撥的 reports 引數中返回。這些報告的 body 屬性是 CSPViolationReportBody 的一個例項。

CSP 違規報告也可以作為 JSON 物件傳送到 Content-Security-Policy 標頭中的 report-to 策略指令指定的端點。這些報告同樣具有 "csp-violation"type,並且 body 屬性包含此介面例項的序列化。

注意: 當使用 CSP report-to 指令指定端點時,Reporting API 傳送的 CSP 違規報告與使用 report-uri 指令指定端點時傳送的 "CSP 報告" JSON 物件 相似(但不完全相同)。Reporting API 和 report-to 指令旨在取代舊的報告格式和 report-uri 指令。

例項屬性

還繼承了其父介面 ReportBody 的屬性。

CSPViolationReportBody.blockedURL 只讀

一個字串,表示因違反 CSP 而被阻止的資源的型別或 URL。

CSPViolationReportBody.columnNumber 只讀

違規發生的指令碼中的列號。

CSPViolationReportBody.disposition 只讀

指示使用者代理如何處理違規策略。將是 "enforce"(強制執行)或 "report"(僅報告)。

CSPViolationReportBody.documentURL 只讀

一個字串,表示發現違規的文件或 worker 的 URL。

CSPViolationReportBody.effectiveDirective 只讀

一個字串,表示揭示了違規的指令。

CSPViolationReportBody.lineNumber 只讀

違規發生的指令碼中的行號。

CSPViolationReportBody.originalPolicy 只讀

一個字串,包含揭示了違規的策略。

CSPViolationReportBody.referrer 只讀

一個字串,表示策略被違反的資源的引薦來源 URL,或者為 null

CSPViolationReportBody.sample 只讀

一個字串,表示導致違規的資源的一個樣本,通常是前 40 個字元。只有當資源是內聯指令碼、事件處理程式或樣式時,才會填充此欄位;導致違規的外部資源不會生成樣本。

CSPViolationReportBody.sourceFile 只讀

如果違規是由指令碼引起的,則此屬性為指令碼的 URL;否則為 null。如果此屬性不是 null,則 columnNumberlineNumber 都應具有非空值。

CSPViolationReportBody.statusCode 只讀

一個數字,表示發生違規的文件或 worker 的 HTTP 狀態碼。

例項方法

還繼承了其父介面 ReportBody 的方法。

CSPViolationReportBody.toJSON() 已棄用

一個序列化器,返回 CSPViolationReportBody 物件的 JSON 表示。

示例

獲取 CSPViolationReportBody 物件

要獲取 CSPViolationReportBody 物件,您必須配置您的頁面以觸發 CSP 違規。在此示例中,我們將 CSP 設定為僅允許來自站點自身源的內容,然後嘗試從 apis.google.com(一個外部源)載入指令碼。

首先,我們在 HTTP 響應中設定 Content-Security-Policy 標頭

http
Content-Security-Policy: default-src 'self';

或在 HTML <meta> 元素中

html
<meta http-equiv="Content-Security-Policy" content="default-src 'self'" />

然後,我們將嘗試載入一個外部指令碼

html
<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>

最後,我們將建立一個新的 ReportingObserver 物件來監聽 CSP 違規(這需要從同一位置載入,並且在觸發違規的指令碼之前)。

js
const observer = new ReportingObserver(
  (reports, observer) => {
    reports.forEach((violation) => {
      console.log(violation);
      console.log(JSON.stringify(violation));
    });
  },
  {
    types: ["csp-violation"],
    buffered: true,
  },
);

observer.observe();

上面我們記錄了每個違規報告物件以及物件的 JSON 字串版本,它可能看起來像下面的物件。請注意,bodyCSPViolationReportBody 的一個例項,而 type"csp-violation"

json
{
  "type": "csp-violation",
  "url": "http://127.0.0.1:9999/",
  "body": {
    "sourceFile": null,
    "lineNumber": null,
    "columnNumber": null,
    "documentURL": "http://127.0.0.1:9999/",
    "referrer": "",
    "blockedURL": "https://apis.google.com/js/platform.js",
    "effectiveDirective": "script-src-elem",
    "originalPolicy": "default-src 'self';",
    "sample": "",
    "disposition": "enforce",
    "statusCode": 200
  }
}

傳送 CSP 違規報告

配置網頁傳送 CSP 違規報告與上一個示例類似。和之前一樣,您需要配置您的頁面以產生違規。

此外,您還需要指定報告將傳送到的端點。伺服器使用 Reporting-Endpoints 響應標頭來指定端點:這些端點必須是安全的 URL (HTTPS)。然後,CSP report-to 指令用於指定特定端點用於報告 CSP 違規。

http
Reporting-Endpoints: csp-endpoint="https://example.com/csp-report-to"
Content-Security-Policy: default-src 'self'; report-to csp-endpoint

和之前一樣,我們可以透過載入 CSP 標頭不允許的外部指令碼來觸發違規。

html
<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>

然後,違規報告將作為 JSON 檔案傳送到指定的端點。從下面的示例可以看出,type"csp-violation"body 屬性是 CSPViolationReportBody 物件的序列化。

json
[
  {
    "age": 53531,
    "body": {
      "blockedURL": "inline",
      "columnNumber": 59,
      "disposition": "enforce",
      "documentURL": "https://example.com/csp-report-to",
      "effectiveDirective": "script-src-elem",
      "lineNumber": 1441,
      "originalPolicy": "default-src 'self'; report-to csp-endpoint",
      "referrer": "https://www.google.com/",
      "sample": "",
      "sourceFile": "https://example.com/csp-report-to",
      "statusCode": 200
    },
    "type": "csp-violation",
    "url": "https://example.com/csp-report-to",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
  }
]

規範

規範
內容安全策略級別 3
# dictdef-cspviolationreportbody

瀏覽器相容性

另見