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));
}