我想将Content Security Policy用于基于JSF 2.1的Web项目,因为我认为它可以显着改善对XSS攻击的防护。
由于CSP对block all inline JavaScript的默认行为,它基本上打破了JSF'
<f:ajax execute="input" render="output" />
功能。这是因为JSF在使用上述构造时会生成许多内联JavaScript代码。
是否有人知道在使用 f:ajax 的基于JSF的项目中是否有使用CSP的方法,而无需通过使用以下CSP指令允许内联JS:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
我知道手动将所有JavaScript放在一个单独的文件中是可能的,但这样做我将被迫手动完成所有Ajax的操作。
答案 0 :(得分:3)
您可以通过使用 nonce 和/或 hash 来避免使用unsafe-inline
source-expression将内联<script>
列入白名单[1]。这样做需要:
在内联nonce
元素中包含<script>
属性,例如
<f:ajax ... pt:nonce="$placeHolder" />
(假设pt
前缀已绑定到http://xmlns.jcp.org/jsf/passthrough
命名空间)。属性的值可能只是视图文件中的占位符,使您可以在以后的所有可信内联<script>
中集体替换它。
占位符的替换(例如,通过Filter
),每个响应中都有一个随机值,并将该值插入到CSP HTTP标头和/或等效的<meta>
元素中,例如,生产
<script ... nonce="126cfb...">
和
Content-Security-Policy: default-src 'self'; ... script-src 'self' 'nonce-126cfb...'
。
理论上,生成的 nonce-value 也应存储在服务器上,以避免在不久的将来重新分配,因为它们应该是唯一的
此外或者替代地,插入每个受信任的内联<script>
内容&#39; 摘要进入CSP HTTP标头和/或等效的<meta>
元素,以及各自的 hash-algo ,例如
Content-Security-Policy: script-src 'sha256-126cfb...='
。
哈希值也应该在准备每个响应时重新生成,因为<script>
通常会随着时间的推移而改变,而使用JSF时,您可能不会立即注意到它们做。