关于html5:脚本和样式元素的HTML“nonce”属性的目的是什么?

What’s the purpose of the HTML “nonce” attribute for script and style elements?

W3C说HTML5.1中有一个新的属性,叫做nonce,用于stylescript,可以被网站的内容安全策略使用。

我在google上搜索了一下,但最后还是没有得到它,这个属性实际上做了什么,在使用它时会发生什么变化?


nonce属性使您能够"白名单"某些内联scriptstyle元素,同时避免使用csp unsafe-inline指令(这将允许所有内联scriptstyle指令),因此您仍然保留一般不允许内联scriptstyle的关键csp功能。

因此,nonce属性是一种告诉浏览器特定脚本或样式元素的内联内容不是由某些(恶意)第三方注入到文档中,而是由控制文档的服务器的人故意放入文档中的方法。

https://developers.google.com/web/fundamentals/security/csp/如果您必须使用,它提供了一个很好的示例,说明如何使用nonce属性,具体步骤如下:

  • 对于您的Web服务器收到的针对特定文档的每个请求,让您的后端从加密安全的随机数生成器(如EDNnf03nceIOfn39fn3e9h3sdfa)生成一个包含至少128位数据的随机base64编码字符串。那是你的现在。

  • 以步骤1中生成的nonce为例,对于任何要"白名单"的内联script/style,使后端代码在通过线发送之前在文档中插入nonce属性,该nonce作为值:

    1
    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…
  • 使用步骤1中生成的nonce,将nonce-预先发送给它,并使您的后端生成一个csp头,其中包含script-srcstyle-src的源列表值:

    1
    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
  • 因此,使用nonce的机制是一种替代方法,而不是让您的后端生成您希望允许的内联scriptstyle的内容散列,然后在CSP头中的相应源列表中指定散列。

    请注意,由于浏览器不能(不能)检查在页面请求之间发送的nonce值是否发生了变化,因此尽管完全不建议跳过上面的1,而不允许后端为nonce动态地执行任何操作,在这种情况下,您可以将带有静态值的nonce属性放入文档的HTML源代码中,并发送一个具有相同nonce值的静态csp头。

    但是你不想这样使用静态nonce的原因是,它在很大程度上破坏了使用静态nonce的全部目的,因为如果你要使用这样的静态nonce,那么在那一点上,你也可以只使用unsafe-inline