我正在尝试为我的Web服务定义CSP策略,并正在使用Scala Play 2.7中的新功能。
这就是我所做的:
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:"
}
}
<script @{CSPNonce.attr}...</script>
<script @{CSPNonce.attr} ..</script>
一些观察结果:
csp.header = true
,则应该在RequestHeader中看到现时值,该值隐含在Twirl模板中。当我打印出标题值时,我根本看不到该标题。@{CSPNonce.attr}
Twirl代码段,都会加载内联JS。这很奇怪,因为我认为只有标记有正确随机数的内联脚本才允许加载。那么这是怎么回事?我不能正确使用此功能吗?
答案 0 :(得分:0)
我怀疑您尚未启用过滤器。
请确保您已添加
play.filters.enabled += play.filters.csp.CSPFilter
发送到您的application.conf
。
在配置示例中,您还将使用csp
而不是play.filters.csp
,所以这也可能是一个问题。
有一个带有HOCON设置的测试规范,您可以根据其检查配置。
答案 1 :(得分:0)
我可以使用 nonce 功能确认 CSP 有效,包括此标头,当启用 CSPFilter 且 play.filters.csp.nonce.enabled
为真且 {{1} } 是真的。不要忘记在此处更改配置后重新启动 sbt。
当您使用 Firefox DOM 检查器(开发人员工具的一部分)检查 html 时,随机数显示为空字符串。您是否尝试过使用右键单击 > 查看源代码来查看 nonce 是否在未处理的原始 html 中?
所有内容似乎都被浏览器列入白名单,直到您在 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>