CSPViolationReportBody: blockedURL 屬性

CSPViolationReportBody 介面的只讀屬性 blockedURL 是一個字串值,表示因違反 內容安全策略 (CSP) 而被阻止的資源。

一個包含值或 URL 的字串,該值或 URL 代表違反策略的資源。

如果該值不是資源的 URL,則它必須是以下字串之一:

inline

內聯資源。例如,當 CSP 中未指定 'unsafe-inline' 時使用的內聯指令碼。

eval

eval()。例如,使用了 eval() 但 CSP 中未指定 'unsafe-eval'

wasm-eval

Wasm 評估。例如,使用了 eval() 但 CSP 中未指定 'wasm-unsafe-eval'

trusted-types-policy

違反 trusted-types CSP 指令的資源。例如,使用 window.trustedTypes.createPolicy() 建立了一個 TrustedTypePolicy,但其名稱未在 CSP 的 trusted-types 指令中列出。

trusted-types-sink

違反 require-trusted-types-for CSP 指令的資源。例如,該指令設定為 script,但文件未使用 TrustedTypePolicy 來在將資料傳遞給 Element.innerHTML 等接收器之前進行清理。

示例

以下示例展示了會產生上述 blockedURL 值的 HTML。

示例假設您有一個名為 main.js 的 JavaScript 檔案,該檔案已從同一域匯入到您的指令碼中。該指令碼(如下所示)會建立一個新的 ReportingObserver 來觀察型別為 "csp-violation" 的內容違規報告。每次呼叫回撥函式時,我們都會在 reports 陣列的第一個條目中記錄 blockedURL

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

observer.observe();

請注意,儘管返回的陣列中可能有多份報告,但為簡潔起見,我們僅記錄第一份報告的 blocked URL。

外部資源的 blockedURL

下面的 HTML 設定了一個策略 Content-Security-Policy: default-src 'self',該策略僅允許載入來自同一站點的資源,然後嘗試從外部站點 https://apis.google.com 載入指令碼。

html
<!doctype html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'" />
    <script src="main.js"></script>
  </head>
  <body>
    <!-- This should generate a CSP violation -->
    <script src="https://apis.google.com/js/platform.js"></script>
  </body>
</html>

記錄 blockedURL 的結果將是

blockedURL: https://apis.google.com/js/platform.js

不安全內聯資源的 blockedURL

下面的 HTML 展示了會導致 blockedURLinline 的條件。它設定了一個策略 Content-Security-Policy: default-src 'self',該策略不允許執行內聯指令碼,由於頁面包含內聯指令碼而導致違規。

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

記錄 blockedURL 的結果將是

blockedURL: inline

受信任型別策略資源的 blockedURL

下面的 HTML 展示了會導致 blockedURLtrusted-types-policy 的條件。首先,它定義了一個允許執行 'unsafe-inline' 指令碼的策略,以便我們可以建立一個將觸發違規的 TrustedTypePolicy。該策略還使用 trusted-types 指令指定允許建立名為 myPolicyTrustedTypePolicy

html
<!doctype html>
<html lang="en">
  <head>
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self' 'report-sample' 'unsafe-inline'; trusted-types myPolicy" />
    <script src="main.js"></script>
  </head>

  <body></body>

  <script>
    const policy = trustedTypes.createPolicy("somePolicy", {
      // Some (insufficient) sanitization code
      createHTML: (string) => string.replace(/</g, "&lt;"),
    });
  </script>
</html>

在指令碼中,會建立一個名為 somePolicy 的策略。

注意:上面定義的特定策略並非一個好的策略。使用受信任型別 (trusted types) 的目的是強制執行某個策略,而不是強制執行特定策略,並確保清理程式碼集中且易於審查。

由於此策略未在 trusted-types 指令中列出,因此這是一個 CSP 違規,我們會看到日誌輸出

blockedURL: trusted-types-policy

如果我們更改允許策略的名稱為 somePolicy,則頁面將不再違反策略。

受信任型別接收器的 blockedURL

下面的 HTML 展示了會導致 blockedURLtrusted-types-sink 的條件。首先,它定義了一個允許執行 'unsafe-inline' 指令碼的策略,並且與前一個示例一樣,它使用 trusted-types 指令指定允許建立名為 myPolicyTrustedTypePolicy

此外,它還指定了 require-trusted-types-for 'script' 指令,該指令強制要求接收器只能接收使用受信任型別清理過的內容。

html
<!doctype html>
<html lang="en">
  <head>
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self' 'report-sample' 'unsafe-inline'; trusted-types 'myPolicy'; require-trusted-types-for 'script'" />
    <script src="main.js"></script>
  </head>
  <body>
    <input type="text" id="userInput" />
    <button>Update Content</button>
    <div id="content"></div>
  </body>

  <script>
    function updateContent() {
      const userInput = document.getElementById("userInput").value;

      // Passing unsanitized content - a violation of the policy
      document.getElementById("content").innerHTML = userInput;
    }

    document.querySelector("button").addEventListener("click", updateContent);
  </script>
</html>

updateContent() 方法會將未經清理的內容傳遞給元素的 innerHTML 屬性,這將導致 CSP 違規。我們會看到日誌輸出

blockedURL: trusted-types-sink

為了避免違規,我們需要更新指令碼以定義一個受信任型別策略,並使用它來清理傳遞給元素的輸入。

js
const policy = trustedTypes.createPolicy("myPolicy", {
  // Some (insufficient) sanitization code
  createHTML: (string) => string.replace(/</g, "&lt;"),
});

function updateContent() {
  const userInput = document.getElementById("userInput").value;
  const sanitizedInput = policy.createHTML(userInput);
  document.getElementById("content").innerHTML = sanitizedInput;
}

規範

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

瀏覽器相容性

另見