内容安全策略 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的主要内容,如果未能解决你的问题,请参考以下文章
Security ❀ CSP Bypass 内容安全策略绕过
Security ❀ CSP Bypass 内容安全策略绕过