CSPViolationReportBody
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,則columnNumber和lineNumber都應具有非空值。 CSPViolationReportBody.statusCode只讀-
一個數字,表示發生違規的文件或 worker 的 HTTP 狀態碼。
例項方法
還繼承了其父介面 ReportBody 的方法。
CSPViolationReportBody.toJSON()已棄用-
一個序列化器,返回
CSPViolationReportBody物件的 JSON 表示。
示例
獲取 CSPViolationReportBody 物件
要獲取 CSPViolationReportBody 物件,您必須配置您的頁面以觸發 CSP 違規。在此示例中,我們將 CSP 設定為僅允許來自站點自身源的內容,然後嘗試從 apis.google.com(一個外部源)載入指令碼。
首先,我們在 HTTP 響應中設定 Content-Security-Policy 標頭
Content-Security-Policy: default-src 'self';
或在 HTML <meta> 元素中
<meta http-equiv="Content-Security-Policy" content="default-src 'self'" />
然後,我們將嘗試載入一個外部指令碼
<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>
最後,我們將建立一個新的 ReportingObserver 物件來監聽 CSP 違規(這需要從同一位置載入,並且在觸發違規的指令碼之前)。
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 字串版本,它可能看起來像下面的物件。請注意,body 是 CSPViolationReportBody 的一個例項,而 type 是 "csp-violation"。
{
"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 違規。
Reporting-Endpoints: csp-endpoint="https://example.com/csp-report-to"
Content-Security-Policy: default-src 'self'; report-to csp-endpoint
和之前一樣,我們可以透過載入 CSP 標頭不允許的外部指令碼來觸發違規。
<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>
然後,違規報告將作為 JSON 檔案傳送到指定的端點。從下面的示例可以看出,type 是 "csp-violation",body 屬性是 CSPViolationReportBody 物件的序列化。
[
{
"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 |
瀏覽器相容性
載入中…