Java Server Faces和内容安全策略?

t3c*_*ris 5 jsf web content-security-policy

我想对基于JSF 2.1的Web项目使用“ 内容安全策略”,因为我认为它可以显着提高对XSS攻击的防护。

由于CSP的默认行为是阻止所有内联JavaScript,因此它基本上破坏了JSF

<f:ajax execute="input" render="output" />
Run Code Online (Sandbox Code Playgroud)

功能。这是因为当使用上述结构时,JSF会生成许多内联JavaScript代码。

有谁知道,如果有一种方法可以在JSF使用CSP基础的项目,其使用的F:AJAX,而不需要让JS在线使用下列CSP指令:

Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
Run Code Online (Sandbox Code Playgroud)

我知道可以将所有JavaScript手动放置在单独的文件中,但是这样做将被迫手动完成所有Ajax的工作。

Uux*_*Uux 4

您可以通过使用随机数和/或散列unsafe-inline来避免使用源表达式将内联列入白名单 [ 1 ]。这样做需要:<script>

  • 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...'

    理论上,生成的随机数值也应该存储在服务器上,以避免在不久的将来重新分配它们,因为它们应该是唯一的

  • 另外或替代地,将每个可信内联<script>内容的摘要插入到 CSP HTTP 标头和/或等效<meta>元素中,以及其各自的哈希算法,例如

    Content-Security-Policy: script-src 'sha256-126cfb...='

    我猜想,在准备每个响应时, hash-value也应该重新生成,因为<script>通常预计 s 会随着时间的推移而变化,而使用 JSF,您可能不会立即注意到它们何时变化。