Playframework “设置”;“内容安全策略”;动态播放2.5

Playframework “设置”;“内容安全策略”;动态播放2.5,playframework,playframework-2.0,guice,content-security-policy,Playframework,Playframework 2.0,Guice,Content Security Policy,建议设置“内容安全策略”的方法是设置 play.filters.headers.contentSecurityPolicy 在application.conf中 但我的要求是,通过读取覆盖配置文件中的一些自定义条目,在代码中动态地设置这一点 一些人可以建议一种方法,通过覆盖application.conf中的值Play.filters.headers.contentSecurityPolicy在Play中设置程序化的contentSecurityPolicy。我对Play一无所知,但是在头之

建议设置“内容安全策略”的方法是设置

play.filters.headers.contentSecurityPolicy 
在application.conf中

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


一些人可以建议一种方法,通过覆盖application.conf中的值Play.filters.headers.contentSecurityPolicy在Play中设置程序化的contentSecurityPolicy。

我对Play一无所知,但是在头之外使用meta标记是向CSP添加内容的一种普遍有效的方法。对动态的框架/库支持有点少见

CSPs首选的传递机制是HTTP头。它可能是有用的, 但是,可以在标记中直接在页面上设置策略。那样做 使用具有http equiv属性的元标记:


这不能用于框架祖先、报表uri或沙盒


注意:meta标记中的策略不会覆盖标题值,就好像您发送了两个标题:它们是相加的

我的requiremnet的解决方案是扩展GuiceApplicationLoader。

//下面的解决方案是将应用程序配置中的“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));
}
公共类MyApplicationLoader扩展了GuiceApplicationLoader{
@凌驾
公共GUI应用程序生成器(ApplicationLoader.Context上下文){
字符串trustedserverList=“”;
if(context.initialConfiguration().getString(“custom.csp.trusted.serverlist”)!=null){
trustedserverList=context.initialConfiguration().getString(“custom.csp.trusted.serverlist”);
}
for(迭代器iter=context.initialConfiguration().entrySet().Iterator();iter.hasNext();){
Entry 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);
额外配置=新配置(“play.filters.headers.contentSecurityPolicy=\”“+csp+”\”);
返回初始值生成器
.in(context.environment())
.loadConfig(额外的.withFallback(context.initialConfiguration()))
.覆盖(覆盖(上下文));
}
}   
返回初始值生成器
.in(context.environment())
.loadConfig(context.initialConfiguration())
.覆盖(覆盖(上下文));
}

}

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

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

然后添加标题覆盖: 确定(“索引”)。带标题(SecurityHeadersFilter.CONTENT\u SECURITY\u POLICY\u HEADER->“默认src*‘不安全内联’‘不安全评估’数据:blob:;”)


~

你说的“动态”是什么意思?应用程序中的不同url需要不同的值?你能给出一个简单的例子来说明你想要达到的目的吗?你不需要这样做——你可以添加你自己的EssentialFilter,它添加一个
内容安全策略
标题,并通过将contentSecurityHeader行设置为null来禁用它。例如,见。
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));
}