【问题标题】:multiple content security policies on play framework播放框架上的多种内容安全策略
【发布时间】:2017-02-14 09:40:36
【问题描述】:
使用播放框架,我想对传入的请求应用不同的策略,以允许外部 html + 脚本在我的网站上运行。这对于为您提供自己的 html + 脚本内容、供用户交互并且必须通过您的原始网站提供的某些第三方集成来说是必要的。
应根据某些条件定义策略,主要是子域。在过滤器规范中,只有一个全局play.filters.headers.contentSecurityPolicy 会影响整个站点。但我不想放松这一点。对某些特定的请求
我的website.com 上的thirdparty.website.com 应该得到一个宽松的政策,甚至根本没有政策,但剩下的网站应该继续紧缩政策。
感谢任何想法或帮助。
【问题讨论】:
标签:
playframework
playframework-2.0
xss
content-security-policy
【解决方案1】:
如果有人需要,这是一个工作示例。 (感谢@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): _*))
}
}
}
另外,将过滤器添加到Filters
class Filters @Inject() (corsFilter: CORSFilter,
allowedHostsFilter: AllowedHostsFilter,
gzipFilter: GzipFilter,
customSecurityHeadersFilter: ConditionalSecurityHeadersFilter
) extends HttpFilters {
def filters = Seq(corsFilter,
allowedHostsFilter,
gzipFilter,
customSecurityHeadersFilter
)
}