内容安全策略 Spring Security

Posted

技术标签:

【中文标题】内容安全策略 Spring Security【英文标题】:Content-Security-Policy Spring Security 【发布时间】:2014-07-26 06:15:12 【问题描述】:

假设 spring security 和 spring mvc 的工作 hello world 示例。

当我使用wireshark 进行跟踪时,我在http 请求中看到以下标志

X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
Strict-Transport-Security: max-age=31536000 ; includeSubDomains 
X-Frame-Options: DENY 
Set-Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; Path=/; Secure; HttpOnly 

我想将此添加到我的标题中:

Content-Security-Policy: script-src 'self'

我知道 X-Frame-Options 几乎可以完成相同的工作,但它仍然让我睡得更好。 现在我想我需要在我的 spring 安全配置的配置功能下执行它但是我不知道具体如何,即我想 .headers().something.something(self)

 @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
//          .csrf().disable()
//          .headers().disable()
            .authorizeRequests()
                .antMatchers(   "/register",
                                "/static/**",
                                "/h2/**",
                                "/resources/**",
                            "/resources/static/css/**", 
                                "/resources/static/img/**" , 
                                "/resources/static/js/**", 
                                "/resources/static/pdf/**"                              
                                ).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    

【问题讨论】:

【参考方案1】:

只需像这样使用 addHeaderWriter 方法:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
   WebSecurityConfigurerAdapter 

  @Override
  protected void configure(HttpSecurity http) throws Exception 
    http
      // ...
      .headers()
        .addHeaderWriter(new StaticHeadersWriter("X-Content-Security-Policy","script-src 'self'"))
      // ...
  

请注意,一旦您指定了应包含的任何标头,则只会包含这些标头。

要包含默认标题,您可以这样做:

http
  .headers()
    .contentTypeOptions()
    .xssProtection()
    .cacheControl()
    .httpStrictTransportSecurity()
    .frameOptions()
    .addHeaderWriter(new StaticHeadersWriter("X-Content-Security-Policy","script-src 'self'"))
    // ...

您可以参考spring security documentation。

【讨论】:

工作就像一个魅力,克里斯托夫谢谢你。我注意到的一件事是 chromium/rekonq/opera 确实在页面加载时显示 css,但是当 ".addHeaderWriter(new StaticHeaderWriter("X-Content-Security-Policy"," script-src 'self'"))" 已启用。还要注意方法“StaticHeaderWriter”即“StaticHeadersWriter”名称中缺少的“s”。我已经看到您发布的参考文档也是这种情况。 好的,我找到了为什么这在 Firefox 中不起作用。我需要在这里使用购买的标题“X-Content-Security-Polic”和“Content-Security-Policy”转换说明developer.mozilla.org/en-US/docs/Web/Security/CSP/… 更新给任何阅读本文的人。如果底部的代码没有运行,您需要在每行的末尾添加“.and()”,例如.contentTypeOptions()..and() .xssProtection().and() 您也可以执行 ".headers(headers -> headers.contentSecurityPolicy("script-src 'self'"))" 而不是重置默认值(请参阅 OP. 【参考方案2】:

虽然StaticHeadersWriter 的方法有效,但在最新版本的 Spring Security 中,可以使用特殊方法:

headers()
    .contentSecurityPolicy("script-src 'self'");

详见文档:https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/headers.html#headers-csp-configure

【讨论】:

【参考方案3】:

如 Spring 安全文档中所述: https://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter 

@Override
protected void configure(HttpSecurity http) throws Exception 
    http
    // ...
    .headers()
        .contentSecurityPolicy("script-src 'self' https://trustedscripts.example.com; object-src https://trustedplugins.example.com; report-uri /csp-report-endpoint/")
        .reportOnly();


【讨论】:

以上是关于内容安全策略 Spring Security的主要内容,如果未能解决你的问题,请参考以下文章

内容安全策略 Spring Security

《华为HCIE安全认证》学习笔记 | 智能策略

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过