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

ata*_*ata 96 html html5 attributes nonce content-security-policy

W3C说,有在HTML5.1一个新的属性称为noncestylescript可以通过一个网站的内容安全策略中使用.

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

sid*_*ker 147

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>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 获取步骤1中生成的nonce,nonce-在其前面添加,并使后端生成一个CSP头,其中包含源列表的值,script-src或者style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 它不是用于验证用户 - 它是用于验证特定脚本或样式元素的内联内容是否未被注入到我的某些(恶意)第三方的文档中,而是被控制服务器的任何人故意放入文档中是来自.(我会更新我的答案.) (13认同)
  • 注意:如果您的脚本是静态的,我建议使用CSP哈希,而不是nonce. (6认同)
  • 随机数不需要存储-而是在内存中生成并插入到CSP标头和通过响应发送到网络上的HTML文档中(而不是存储在服务器文件系统/数据库中的源中)。 (3认同)
  • @sideshowbarker,空随机数有什么作用?我看到带有 `&lt;script type="text/javascript" nonce&gt;` 和 `&lt;style type="text/css" nonce&gt;` 的页面 (3认同)
  • 如果“中间”有人设法在您的页面中注入内联脚本,那么他们在其中放入随机数并更改 CSP 标头有多困难? (3认同)
  • 至于使用nonce属性的任何理由,如果您绝对不需要使用它,那么就不用。实际上,这仅适用于因某些原因而无法(但仍要)删除特定文档中的某些内联脚本或样式内容的情况(但应在以后将其删除)。因此,如果由于某种原因您需要保留内联脚本和样式内容,那么与此同时,您至少可以使用随机数机制让浏览器验证它们是否可以。否则,您应该按照实际意图完全使用CSP,并且不允许任何内联脚本或样式元素 (2认同)
  • @Pacerier在这些情况下,您在这些页面的 Content-Security-Policy 响应标头或“&lt;meta http-equiv="Content-Security-Policy"&gt;”元素中看到什么“nonce-*”值(如果有) ?无论如何,空的“nonce”属性除了始终使任何 CSP 随机数检查失败之外没有任何作用,因为根据 CSP 规范中的要求,CSP 策略中的任何“nonce-*”值都必须是非空的。请参阅 https://w3c.github.io/webappsec-csp/#match-nonce-to-source-list。因此,我猜想您看到的那些空的“nonce”属性只是后端在提供页面之前未能填充该值的情况。 (2认同)
  • @NicolasHoizey 您的问题没有通用答案,但可能要困难得多。可以通过存储/反射 XSS 攻击(相当常见的漏洞)将内联脚本注入您的页面。但是您通常无法更改服务器从 JS 发送的标头。要做到这一点,您必须在目标服务器上远程执行代码——好吧,在这种情况下,事情已经很糟糕了,没有什么可以拯救你。 (2认同)
  • @user1073287 和其他人 - **不要**使用静态随机数值!这破坏了随机数的目的。它们应该在每次页面加载时以不同的方式生成,否则黑客可以轻松破解它们。使用哈希值要好得多。 (2认同)