这是https://github.com/w3c/webappsec-csp/issues/215的后续行动.阿图鲁亚克建议将讨论移到堆栈溢出。
我们正在为JSF中的脚本实现CSP,并且不知道在整个会话中重用脚本是否安全。或者,就像arturjanc建议的那样,让原始文档将其当前的当前状态发送到生成未来响应的服务器。
假设在整个会话中重用nonce是不安全的,那么只在隐藏的表单输入中包含初始的nonce就可以了,比如当前实现的这里。(暂时忽略CSP头/XSS注入漏洞-它只是一个原型)
@arturjanc:你想再插话吗?
编辑:关于arturjanc回答的其他想法:
请您更详细地介绍一下如何在当今典型的JSF应用程序中实现每个响应的非per,即在开始时只加载一个完整的页面,然后只进行XHR通信?
如果我正确地理解了您,那么您的建议将是始终在每个XHR请求中重新发送最初生成的nonce。然而,在实践中,这实际上是完全相同的,每个会话,不是吗?只是在实现方面比较复杂。
严格地实现每个响应的非per将意味着后续的响应也必须包括在该会话早期创建的所有非per,因此我们将以某种方式跟踪会话中的所有非per。
为每个XHR响应设置新的CSP头,只包含新创建的每个响应当前,可能因为浏览器通过使用交叉策略合并多个CSP头而无法工作,即响应1中的Content-Security-Policy: 'nonce-1'和响应2中的Content-Security-Policy: 'nonce-2'将使响应2之后的两个非new无效。
发布于 2019-05-07 20:36:08
遗憾的是,对于您的问题,没有一个正确的答案:使用每个会话的nonce显然不是错误的,但是它引入了这样的风险:每当攻击者可能泄漏一个nonce时,它就会在另一个页面负载上被重用,从而允许攻击者利用一个XSS错误,否则CSP就会减轻它的漏洞。
具体来说,当您在隐藏的输入字段中包含当前值时,它允许滥用CSS选择器对值进行解压缩;请注意,相同的攻击不会针对script#nonce属性工作,因为浏览器将该属性值隐藏在DOM中以防止此类攻击。
我的建议有两方面:
nonce参数的URL使用XHR,则执行类似于xhr.open("/my/url?nonce=" + document.currentScript.nonce)的操作https://stackoverflow.com/questions/55965435
复制相似问题