脚本和样式元素的HTML“ nonce”属性的用途是什么?


140

W3C表示,HTML5.1中有一个新属性需要调用noncestyle并且script可以由网站的内容安全策略使用。

我用谷歌搜索它,但最终没有得到它,实际上该属性的作用以及使用该属性时会发生什么变化?


2
看起来,这只是您网站的额外安全措施,您将其添加到链接或表单中,并且在提供该页面时,如果现时不匹配您,则您将不会为该页面提供服务
Pete

@Pete那么你说没有人能够加载scriptstyle?像热链接禁令一样?
ATA

它也适用于普通页面和表单验证
Pete

Answers:


195

nonce属性使您可以将某些内联scriptstyle元素“列入白名单” ,同时避免使用CSP unsafe-inline指令(这将允许所有内联script/ style),因此您仍然保留了通常禁止内联script/ 的关键CSP功能style

因此,该nonce属性是一种告诉浏览器的方法,即某个(恶意)第三方未将特定脚本或样式元素的内联内容注入到文档中,而是由控制文件提供服务的服务器的人有意将其放入文档中从。

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it很好地说明了如何使用该nonce属性,该步骤包括以下步骤:

  1. 对于您的Web服务器收到的针对特定文档的每个请求,请让您的后端从加密安全的随机数生成器中生成至少128位数据的随机base64编码的字符串;例如EDNnf03nceIOfn39fn3e9h3sdfa。那是你的现时

  2. 以步骤1中生成的随机数为例,对于要内联script/的style“白名单”,请让您的后端代码nonce在通过网络发送文档之前将属性插入文档中,并以该随机数为值:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. 将步骤1中生成的随机数添加nonce-到它的前面,并使您的后端生成一个CSP标头,其中包含script-src或的源列表中的值style-src

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

因此,使用随机数的机制是让后端生成内联scriptstyle您要允许的内联内容的哈希值,然后在CSP标头中的适当源列表中指定该哈希值的替代方法。

请注意,由于浏览器无法(无法)检查在两次页面请求之间发送的现时值是否发生了变化,因此尽管略微不建议,但有可能跳过上面的1并且后端不对现时值进行动态处理,在这种情况下,可以只将nonce具有静态值的属性放入文档的HTML源中,并发送具有相同随机数值的静态CSP标头。

但是,您不希望以这种方式使用静态随机数的原因是,它完全违背了从根本上使用随机数的全部目的-因为,如果您要使用这样的静态随机数,到那时,您不妨使用unsafe-inline


17
这不是为了验证用户,而是为了验证特定脚本或样式元素的内联内容没有通过某些(恶意)第三方注入到文档中,而是由控制服务器的人有意地放入了文档中。被送达。(我将回答的内容更新为这样。)
sideshowbarker

3
随机数无需存储-而是在内存中生成并插入到CSP标头和通过响应发送的有线HTML文档中(而不是存储在服务器文件系统/数据库中的源)。
sideshowbarker

3
至于使用该nonce属性的任何理由,如果您绝对不需要使用该属性,那么就不用。实际上,这仅适用于因某些原因而无法(但仍要)删除特定文档中的某些内联脚本或样式内容的情况(但应在以后将其删除)。因此,如果由于某种原因您需要保留内联脚本和样式内容,那么与此同时,您至少可以使用随机数机制让浏览器验证它们是否正常。否则,您应该按照实际意图完全使用CSP,并且不允许任何内联脚本或样式元素
sideshowbarker

2
@sideshowbarker,一个空的随机数是做什么的?我看到带有<script type="text/javascript" nonce><style type="text/css" nonce>
Pacerier的

7
注意:如果脚本是静态的,则建议使用CSP哈希,而不是随机数。
布莱恩(Brian)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.