play 2.5动态设置"content Security Policy"

Set "content Security Policy" dynamically in play 2.5

播放推荐方式设置"content Security Policy"是设置

play.filters.headers.contentSecurityPolicy 

在 application.conf.

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

能否请一些人提出一种方法,通过覆盖 application.conf 中的值 play.filters.headers.contentSecurityPolicy 来在 Play 编程中设置 contentSecurityPolicy。

我对 Play 一无所知,但向您的 CSP 添加 内容的普遍有效方法是使用元标记以及 header。 Framework/library 很少支持动态。

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

CSPs preferred delivery mechanism is an HTTP header. It can be useful, however, to set a policy on a page directly in the markup. Do that using a meta tag with an http-equiv attribute:

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

This can’t be used for frame-ancestors, report-uri, or sandbox.

注意:元标记中的策略不会覆盖 header 值,就好像您发送了两个 header:它们是添加剂。

我的要求的解决方案是扩展 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));
}

}

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

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

然后添加header覆盖: 好的("Index").withHeaders(SecurityHeadersFilter.CONTENT_SECURITY_POLICY_HEADER -> "default-src * 'unsafe-inline' 'unsafe-eval' data: blob:;")

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