Playframework play框架上的多种内容安全策略
使用play framework,我希望对传入的请求应用不同的策略,以允许外部html+脚本在我的网站上运行。这对于一些第三方集成是必要的,他们为您提供自己的html+脚本内容,供用户交互,并且必须通过您的原始网站交付 策略应该基于某些条件定义,主要是子域。在过滤器规范中,只有一个全局过滤器影响整个站点。但我不想放松。对某些特定问题的请求 我的Playframework play框架上的多种内容安全策略,playframework,playframework-2.0,xss,content-security-policy,Playframework,Playframework 2.0,Xss,Content Security Policy,使用play framework,我希望对传入的请求应用不同的策略,以允许外部html+脚本在我的网站上运行。这对于一些第三方集成是必要的,他们为您提供自己的html+脚本内容,供用户交互,并且必须通过您的原始网站交付 策略应该基于某些条件定义,主要是子域。在过滤器规范中,只有一个全局过滤器影响整个站点。但我不想放松。对某些特定问题的请求 我的website.com上的thirdparty.website.com应该有宽松的政策,甚至根本没有政策,但剩下的网站应该继续实行紧缩政策 我很感激任何想
website.com
上的thirdparty.website.com
应该有宽松的政策,甚至根本没有政策,但剩下的网站应该继续实行紧缩政策
我很感激任何想法或帮助。如果有人需要,这里有一个工作示例。(感谢@mkurz的指点) 非常简单,这里复制SecurityHeadersFilter应用,如果主机和路径条件都满足,则跳过安全头。如果不是,则保留原始行为
class ConditionalSecurityHeadersFilter @Inject() (implicit config: SecurityHeadersConfig) extends SecurityHeadersFilter(config) {
override def apply (next: EssentialAction) = EssentialAction { req =>
val HostPattern: Regex = "..some regex..".r
val PathsToBypass: List[String] = [...]
import play.api.libs.iteratee.Execution.Implicits.trampoline
req.host.toLowerCase match {
case HostPattern(...) =>
if (PathsToBypass.map{path =>
path.r.findFirstIn(req.path)
}.count { p => p.isDefined } > 0)
next(req)
else
next(req).map(_.withHeaders(headers(req): _*))
case _ => next(req).map(_.withHeaders(headers(req): _*))
}
}
}
另外,将过滤器添加到过滤器中
class Filters @Inject() (corsFilter: CORSFilter,
allowedHostsFilter: AllowedHostsFilter,
gzipFilter: GzipFilter,
customSecurityHeadersFilter: ConditionalSecurityHeadersFilter
) extends HttpFilters {
def filters = Seq(corsFilter,
allowedHostsFilter,
gzipFilter,
customSecurityHeadersFilter
)
}
您可能需要编写自己的过滤器。在此筛选器中,您可以检查
请求
对象中的头、域等,然后将特定头应用于响应。看看Play是如何实现它的SecurityHeadersFilterThanks@mkurz的,你所描述的方式非常有效。很高兴听到我能帮忙。