W3C 表示 HTML5.1 中有一个新属性需要nonce,style并且script可以被网站的内容安全策略使用。
nonce
style
script
我用谷歌搜索了它,但最后没有得到它实际上这个属性的作用以及使用它时有什么变化?
该nonce属性允许您“hitelist”某些内联script和style元素,同时避免使用 CSPunsafe-inline指令(这将允许 所有 内联script/ style),因此您仍然保留一般禁止内联script/的关键 CSP 功能style。
unsafe-inline
因此,该nonce属性是告诉浏览器特定脚本或样式元素的内联内容不是由某些(恶意)第三方注入到文档中的方式,而是由控制服务器的任何人故意放入文档中。从。
Web Fundamentals Content Security Policy文章 ——如果你绝对必须使用它...... 部分有一个很好的例子来说明如何使用该nonce属性,它相当于以下步骤:
对于您的 Web 服务器收到的针对特定文档的每个请求,让您的后端从密码安全的随机数生成器中生成至少 128 位的随机 base64 编码字符串;例如,EDNnf03nceIOfn39fn3e9h3sdfa。那是你的随机数。
EDNnf03nceIOfn39fn3e9h3sdfa
以步骤 1 中生成的 nonce 为例,对于任何想要“hitelist”的内联script/ ,请让您的后端代码在通过网络发送之前将属性插入到文档中,并将该 nonce 作为值:style``nonce
style``nonce
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">鈥�</script>
将步骤 1 中生成的 nonce 放在前面,并让您的后端生成一个 CSP 标头,其中包含用于ornonce-的源列表的值:script-src``style-src
nonce-
script-src``style-src
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
因此,使用随机数的机制是一种替代方法,而不是让您的后端生成内联内容的哈希script或style您想要允许的哈希,然后在您的 CSP 标头中的适当源列表中指定该哈希。
注意:浏览器不会(可以)检查服务器发送的 nonce 值是否在页面请求之间实际发生变化;因此,虽然完全不建议您跳过上面的 1 并且不让您的后端为 nonce 动态执行任何操作,但这是可能的——尽管完全不可取,在这种情况下,您可以将nonce具有静态值的属性放入文档的 HTML 源代码中,并发送具有相同随机数值的静态 CSP 标头。
但是你不想以这种方式使用静态随机数的原因是,它几乎完全违背了使用随机数的全部目的,因为如果你要使用这样的静态随机数,此时您还不如只使用unsafe- inline.
unsafe- inline
至于哪些元素是“一次性的”:CSP 规范目前限制浏览器只检查script和style元素的随机数。以下是规格详情:
在https://w3c.github.io/webappsec-csp/#match-element-to-source-list中,见第2步: 如果type是“script”或者“style”,并且搂‘6.6.3.1是element不可预测? 返回“Nonceable”——
在https://w3c.github.io/webappsec-csp/#is-element-nonceable, Is element nonceable? 算法本身并不只检查script/style元素;但规范调用的唯一地方是上面引用的部分,它将其限制为scriptand style。因此,如果您在任何其他元素上放置随机数,当前规范要求浏览器忽略它。