小编典典

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

all

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

我用谷歌搜索了它,但最后没有得到它实际上这个属性的作用以及使用它时有什么变化?


阅读 114

收藏
2022-06-23

共1个答案

小编典典

nonce属性允许您“hitelist”某些内联scriptstyle元素,同时避免使用 CSPunsafe-inline指令(这将允许
所有 内联script/ style),因此您仍然保留一般禁止内联script/的关键 CSP 功能style

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


Web Fundamentals Content Security
Policy
文章
——如果你绝对必须使用它......
部分有一个很好的例子来说明如何使用该nonce属性,它相当于以下步骤:

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

  2. 以步骤 1 中生成的 nonce 为例,对于任何想要“hitelist”的内联script/ ,请让您的后端代码在通过网络发送之前将属性插入到文档中,并将该 nonce 作为值:style``nonce

     <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">鈥�</script>
    
  3. 将步骤 1 中生成的 nonce 放在前面,并让您的后端生成一个 CSP 标头,其中包含用于ornonce-的源列表的值:script-src``style-src

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

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


注意:浏览器不会(可以)检查服务器发送的 nonce 值是否在页面请求之间实际发生变化;因此,虽然完全不建议您跳过上面的 1 并且不让您的后端为 nonce
动态执行任何操作,但这是可能的——尽管完全不可取,在这种情况下,您可以将nonce具有静态值的属性放入文档的 HTML
源代码中,并发送具有相同随机数值的静态 CSP 标头。

但是你不想以这种方式使用静态随机数的原因是,它几乎完全违背了使用随机数的全部目的,因为如果你要使用这样的静态随机数,此时您还不如只使用unsafe- inline.


至于哪些元素是“一次性的”:CSP 规范目前限制浏览器只检查scriptstyle元素的随机数。以下是规格详情:

2022-06-23