Java Server Faces和内容安全策略?

时间:2014-03-23 16:23:15

标签: jsf web content-security-policy

我想将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的操作。

1 个答案:

答案 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时,您可能不会立即注意到它们做。