W3C表示HTML5.1中有一个名为nonce
的新属性,用于style
和script
,可以被网站的内容安全策略使用。
我搜索了它,但最终没有得到它实际上这个属性做什么和使用它时会发生什么变化?
nonce
属性使您能够将某些内联script
和style
元素“白名单”,同时避免使用CSP unsafe-inline
指令(这将允许所有内联script
/ style
),这样您仍然保留禁用内联script
/ style
的关键CSP功能一般来说。
因此,nonce
属性是告诉浏览器特定脚本或样式元素的内联内容未被某些(恶意)第三方注入文档的方式,而是由控制服务器的任何人故意将文档放入文档中。来自。
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it给出了如何使用nonce
属性的一个很好的例子,该属性归结为以下步骤:
EDNnf03nceIOfn39fn3e9h3sdfa
。那是你的现时。script
/ style
,使后端代码在通过网络发送之前将nonce
属性插入到文档中,并将该随机数作为值:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
nonce-
添加到其中,并使后端生成一个CSP标头,其中包含script-src
或style-src
的源列表中的值:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
因此,使用随机数的机制是替代,而是让后端生成要允许的内联script
或style
内容的哈希值,然后在CSP头中的相应源列表中指定该哈希值。
请注意,因为浏览器不能(不能)检查发送的现时值是否在页面请求之间发生变化,所以可以 - 尽管完全不可取 - 跳过上面的1而不让你的后端为nonce动态做任何事情,在这种情况下你可以将带有静态值的nonce
属性放入文档的HTML源代码中,并发送具有相同nonce值的静态CSP头。
但是你不想以这种方式使用静态随机数的原因是,它几乎完全违背了使用随机数的全部目的 - 因为,如果你要使用这样的静态随机数,在那一点上你可能只是使用unsafe-inline
。