在2.5中动态设置“内容安全策略”

时间:2016-08-12 00:53:38

标签: playframework playframework-2.0 guice content-security-policy

播放推荐方式设置“内容安全策略”是设置

play.filters.headers.contentSecurityPolicy 

在application.conf中。

但我的要求是通过读取覆盖配置文件中的一些自定义条目在代码中动态设置它。

有些人可以通过覆盖application.conf中的值play.filters.headers.contentSecurityPolicy来建议一种在Play programmatic中设置contentSecurityPolicy的方法。

3 个答案:

答案 0 :(得分:1)

如果您只需要特定于页面的覆盖:

application.conf     play.filters.headers.allowActionSpecificHeaders =真

然后添加标头覆盖:     好的(“索引”)。withHeaders(SecurityHeadersFilter.CONTENT_SECURITY_POLICY_HEADER - >“default-src *'unsafe-inline''unsafe-eval'数据:blob:;”)

https://www.playframework.com/documentation/2.6.x/SecurityHeaders#Action-specific-overrides

答案 1 :(得分:0)

我对Play一无所知,但除了标题之外,添加内容的一种普遍有效的方法是使用元标记。框架/库对动态的支持有点罕见。

来自http://www.html5rocks.com/en/tutorials/security/content-security-policy/

  

CSP首选传递机制是HTTP标头。它很有用,   但是,直接在标记中设置页面上的策略。去做   使用带有http-equiv属性的元标记:

<meta http-equiv="Content-Security-Policy" content="default-src
 https://cdn.example.net; child-src 'none'; object-src 'none'">
  

这不能用于frame-ancestors,report-uri或sandbox。

注意:元标记中的策略不会覆盖标头值,就像您发送了两个标头一样:它们是附加的。

答案 2 :(得分:0)

我的requiremnet的解决方案是扩展GuiceApplicationLoader。 (Play documentation on this.)

//以下解决方案是将应用程序配置中的“play.filters.headers.contentSecurityPolicy”与应用程序配置中的另一个自定义设置结合起来。

public class MyApplicationLoader extends GuiceApplicationLoader {

@Override
public GuiceApplicationBuilder builder(ApplicationLoader.Context context) {   

    String trustedserverList = "";
    if (context.initialConfiguration().getString("custom.csp.trusted.serverlist") != null ){
        trustedserverList = context.initialConfiguration().getString("custom.csp.trusted.serverlist"); 
    }

    for ( Iterator<Entry<String, ConfigValue>> iter = context.initialConfiguration().entrySet().iterator(); iter.hasNext(); ) {
        Entry<String, ConfigValue> con = iter.next();

        if (StringUtils.equals(con.getKey(), "play.filters.headers.contentSecurityPolicy")) {
            String csp = context.initialConfiguration().getString("play.filters.headers.contentSecurityPolicy");
            csp = String.format(csp,trustedserverList);                     
            Configuration extra = new Configuration("play.filters.headers.contentSecurityPolicy=\"" + csp + "\"");              
            return initialBuilder
                    .in(context.environment())
                    .loadConfig(extra.withFallback(context.initialConfiguration()))
                    .overrides(overrides(context));
        }
    }   
    return initialBuilder
        .in(context.environment())
        .loadConfig(context.initialConfiguration())
        .overrides(overrides(context));
}

}