W3C表示,HTML5.1中有一个新属性,称为style
和script
的nonce
,可供网站的内容安全策略使用。
我用谷歌搜索了一下,但最后还是没弄明白,这个属性到底是做什么的,在使用它时有什么变化?
发布于 2017-03-21 18:10:36
nonce
属性允许您将某些内联script
和style
元素“白名单”,同时避免使用CSP unsafe-inline
指令(它将允许所有内联script
/style
),因此您仍然保留了CSP的关键特性,即一般情况下不允许内联script
/style
。
因此,nonce
属性可以告诉浏览器特定脚本或样式元素的内联内容不是由某些(恶意的)第三方注入到文档中的,而是由控制提供文档的服务器的任何人故意放入文档中的。
网络基础Content Security Policy文章的部分有一个很好的例子,说明了如何使用nonce
属性,它分为以下几个步骤:
EDNnf03nceIOfn39fn3e9h3sdfa
)生成一个至少128位的随机base64编码字符串。这就是你的现实主义。script
/style
,使后端代码在文档通过网络发送之前插入一个nonce
属性,并将该随机数作为值:nonce-
,并让您的后端使用script-src
或style-src
的源列表值中的值生成CSP header:内容-安全-策略:脚本-源'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
因此,使用现时值的机制是另一种选择,而不是让您的后端生成您想要允许的内联script
或style
的内容的散列,然后在CSP标头中的适当源列表中指定该散列。
请注意,因为浏览器不(不能)检查在页面请求之间发送的nonce值是否发生了变化,所以可以跳过上面的1,并且不让您的后端为nonce动态执行任何操作,在这种情况下,您可以将一个带有静态值的nonce
属性放入文档的HTML源中,然后发送一个带有相同nonce值的静态CSP头。
但是你不想以这种方式使用静态nonce的原因是,它很可能在一开始就违背了使用nonce的全部目的-因为,如果你要使用像那样的静态nonce,在这一点上你可能只需要使用unsafe-inline
。
至于哪些元素是“不可撤销的”:CSP规范目前限制浏览器只检查script
和style
元素的随机数。以下是规格的详细信息:
如果类型是“脚本”或“样式”,并且§ 6.6.3.1是元素不可撤销的吗?返回"Nonceable"…
script
/style
元素;但规范调用的唯一地方是上面引用的部分,它将其限制为script
和style
。因此,如果您将现时值放在任何其他元素上,则当前规范要求浏览器忽略它。https://stackoverflow.com/questions/42922784
复制相似问题