在Play 2.7中使用CSP过滤器的正确方法

时间:2019-06-19 14:40:54

标签: scala playframework

我正在尝试为我的Web服务定义CSP策略,并正在使用Scala Play 2.7中的新功能。

这就是我所做的:

  1. 在我的application.conf中设置CSP指令和随机数配置
      csp {
        nonce {
          enabled = true
          pattern = "%CSP_NONCE_PATTERN%"
          header = false
        }

        directives {
          base-uri = "'none'"
          object-src = "'none'"
          script-src = ${play.filters.csp.nonce.pattern} "'unsafe-inline' 'unsafe-eval' 'strict-dynamic' https: http:"
        }
      }
  1. 在Twirl模板中,我对现时的引用如下:
<script @{CSPNonce.attr}...</script>

<script @{CSPNonce.attr} ..</script>

一些观察结果:

  1. 根据文档,如果我在application.conf中打开csp.header = true,则应该在RequestHeader中看到现时值,该值隐含在Twirl模板中。当我打印出标题值时,我根本看不到该标题。
  2. 类似地,当我在浏览器中查看生成的HTML时,在脚本标记中看不到现时值。
  3. 无论我是否在内联脚本代码中添加@{CSPNonce.attr} Twirl代码段,都会加载内联JS。这很奇怪,因为我认为只有标记有正确随机数的内联脚本才允许加载。

那么这是怎么回事?我不能正确使用此功能吗?

2 个答案:

答案 0 :(得分:0)

我怀疑您尚未启用过滤器。

请确保您已添加

play.filters.enabled += play.filters.csp.CSPFilter

发送到您的application.conf

在配置示例中,您还将使用csp而不是play.filters.csp,所以这也可能是一个问题。

有一个带有HOCON设置的测试规范,您可以根据其检查配置。

https://github.com/playframework/playframework/blob/2.7.x/web/play-filters-helpers/src/test/scala/play/filters/csp/CSPFilterSpec.scala#L69

答案 1 :(得分:0)

  1. 我可以使用 nonce 功能确认 CSP 有效,包括此标头,当启用 CSPFilter 且 play.filters.csp.nonce.enabled 为真且 {{1} } 是真的。不要忘记在此处更改配置后重新启动 sbt。

  2. 当您使用 Firefox DOM 检查器(开发人员工具的一部分)检查 html 时,随机数显示为空字符串。您是否尝试过使用右键单击 > 查看源代码来查看 nonce 是否在未处理的原始 html 中?

  3. 所有内容似乎都被浏览器列入白名单,直到您在 CSP 中指定 nonce,这可以像这样完成:play.filters.csp.nonce.header 并且 play.filters.csp.directives.script-src = ${play.filters.csp.nonce.pattern} "'self' 'unsafe-inline' 'unsafe-eval'"play.filters.csp.nonce.pattern。< /p>