Динамическая установка политики безопасности контента в игре 2.5

Рекомендуемый способ установки «Политики безопасности контента» — установить

play.filters.headers.contentSecurityPolicy 

в приложении.conf.

Но мое требование состоит в том, чтобы установить это динамически в коде, прочитав некоторые пользовательские записи в файле конфигурации переопределения.

Может кто-нибудь предложить способ программной установки contentSecurityPolicy в Play, переопределив значение play.filters.headers.contentSecurityPolicy в application.conf.


person Hiran    schedule 12.08.2016    source источник
comment
Что вы имеете в виду под динамическим? Вам нужны разные значения для разных URL-адресов в вашем приложении? Можете ли вы привести краткий пример того, чего вы пытаетесь достичь?   -  person Salem    schedule 12.08.2016


Ответы (3)


Если вам просто нужно переопределить конкретную страницу:

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

Затем добавьте переопределение заголовка: Ok("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

person Adam Lane    schedule 02.10.2017

Я ничего не знаю о Play, но универсальный эффективный способ добавлять что-то в ваш 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'">

Это нельзя использовать для предков фреймов, report-uri или песочницы.

Примечание: политика в метатеге не перезаписывает значение заголовка, как если бы вы отправили два заголовка: они складываются.

person oreoshake    schedule 12.08.2016

Решение моего 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));
}

}

person Hiran    schedule 06.09.2016
comment
Вам не нужно этого делать — вы можете добавить свой собственный EssentialFilter, который добавляет заголовок Content-Security-Policy, и отключить строку contentSecurityHeader, установив для нее значение null. См. github.com/playframework Например, /play-scala-chatroom-example/blob/2.6.x/. - person Will Sargent; 28.06.2017