Answers:
该nonce
属性使您可以将某些内联script
和style
元素“列入白名单” ,同时避免使用CSP unsafe-inline
指令(这将允许所有内联script
/ style
),因此您仍然保留了通常禁止内联script
/ 的关键CSP功能style
。
因此,该nonce
属性是一种告诉浏览器的方法,即某个(恶意)第三方未将特定脚本或样式元素的内联内容注入到文档中,而是由控制文件提供服务的服务器的人有意将其放入文档中从。
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it很好地说明了如何使用该nonce
属性,该步骤包括以下步骤:
对于您的Web服务器收到的针对特定文档的每个请求,请让您的后端从加密安全的随机数生成器中生成至少128位数据的随机base64编码的字符串;例如EDNnf03nceIOfn39fn3e9h3sdfa
。那是你的现时
以步骤1中生成的随机数为例,对于要内联script
/的style
“白名单”,请让您的后端代码nonce
在通过网络发送文档之前将属性插入文档中,并以该随机数为值:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
将步骤1中生成的随机数添加nonce-
到它的前面,并使您的后端生成一个CSP标头,其中包含script-src
或的源列表中的值style-src
:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
因此,使用随机数的机制是让后端生成内联script
或style
您要允许的内联内容的哈希值,然后在CSP标头中的适当源列表中指定该哈希值的替代方法。
请注意,由于浏览器无法(无法)检查在两次页面请求之间发送的现时值是否发生了变化,因此尽管略微不建议,但有可能跳过上面的1并且后端不对现时值进行动态处理,在这种情况下,可以只将nonce
具有静态值的属性放入文档的HTML源中,并发送具有相同随机数值的静态CSP标头。
但是,您不希望以这种方式使用静态随机数的原因是,它完全违背了从根本上使用随机数的全部目的-因为,如果您要使用这样的静态随机数,到那时,您不妨使用unsafe-inline
。
nonce
属性的任何理由,如果您绝对不需要使用该属性,那么就不用。实际上,这仅适用于因某些原因而无法(但仍要)删除特定文档中的某些内联脚本或样式内容的情况(但应在以后将其删除)。因此,如果由于某种原因您需要保留内联脚本和样式内容,那么与此同时,您至少可以使用随机数机制让浏览器验证它们是否正常。否则,您应该按照实际意图完全使用CSP,并且不允许任何内联脚本或样式元素
<script type="text/javascript" nonce>
和<style type="text/css" nonce>