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

问题描述 投票:72回答:1

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

我搜索了它,但最终没有得到它实际上这个属性做什么和使用它时会发生什么变化?

html html5 attributes content-security-policy nonce
1个回答
120
投票

nonce属性使您能够将某些内联scriptstyle元素“白名单”,同时避免使用CSP unsafe-inline指令(这将允许所有内联script / style),这样您仍然保留禁用内联script / style的关键CSP功能一般来说。

因此,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,将nonce-添加到其中,并使后端生成一个CSP标头,其中包含script-srcstyle-src的源列表中的值: Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

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

请注意,因为浏览器不能(不能)检查发送的现时值是否在页面请求之间发生变化,所以可以 - 尽管完全不可取 - 跳过上面的1而不让你的后端为nonce动态做任何事情,在这种情况下你可以将带有静态值的nonce属性放入文档的HTML源代码中,并发送具有相同nonce值的静态CSP头。

但是你不想以这种方式使用静态随机数的原因是,它几乎完全违背了使用随机数的全部目的 - 因为,如果你要使用这样的静态随机数,在那一点上你可能只是使用unsafe-inline

© www.soinside.com 2019 - 2024. All rights reserved.