集“内容安全策略”动态地发挥2.5

问题描述:

游戏推荐方法来设置“内容安全策略”是设置集“内容安全策略”动态地发挥2.5

play.filters.headers.contentSecurityPolicy 

在application.conf。

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

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

+0

你是什么意思的“动态”?你的应用中的不同网址需要不同的值?你能给出一个你想要实现的简洁例子吗? – Salem

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

}

+0

你不需要这样做 - 你可以添加自己的EssentialFilter,添加一个Content-Security-Policy头,并通过将contentSecurityHeader行设置为null来禁用它。例如,请参阅https://github.com/playframework/play-scala-chatroom-example/blob/2.6.x/app/filters/ContentSecurityPolicyFilter.scala。 –

我不知道关于Play的任何内容,但是一种普遍有效的方式add事情到您的CSP使用除标头以外的元标记。框架/库对动态的支持很少见。

从优选的递送机制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'"> 

这不能用于帧的祖先,报告-URI或沙箱。

注意:在meta标签不会覆盖头值的政策,这是因为如果你送了两个头:他们是添加剂。

如果你只需要一个页面特定的控制装置:

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

然后加头覆盖: 好( “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