使用Spring Security保护Web应用程序免受CSRF攻击

时间:2019-04-18 08:36:43

标签: javascript java spring spring-security csrf

我正在Web应用程序中实现CSRF保护。

我已经使用org.springframework.security.web.csrf.CookieCsrfTokenRepository类来生成X-XSRF令牌。该令牌在每个请求的响应中均作为cookie发送。

作为部署在不同服务器上的单页应用程序的UI组件,将读取此cookie,并从cookie中读取X-XSRF令牌,并将其设置为所有后续请求中的标头。

Spring验证收到的X-XSRF令牌并允许/拒绝请求。这很好。

但这是X-XSRF cookie的约束,必须是httpOnlyfalse,以便客户端JavaScript可以读取它。

我们无法读取httpOnlytrue的Cookie。

在X-XSRF令牌cookie httpOnlytrue的Web应用程序中,是否还有其他方法可以保护Web应用程序CSRF。

使用JavaScript方法(document.cookie)无法读取其httpOnly属性设置为true的cookie,请参阅:

在Websphere中,httpOnlyfalse,因此我无法进行更改以制作所有cookie。

还是我缺少客户端JavaScript可以读取httpOnly的cookie的东西true

1 个答案:

答案 0 :(得分:1)

请参见Spring Security Reference

  

CookieCsrfTokenRepository

     

在某些情况下,用户可能希望将CsrfToken保留在cookie中。默认情况下,CookieCsrfTokenRepository将写入名为XSRF-TOKEN的cookie,并从名为X-XSRF-TOKEN的标头或HTTP参数_csrf中读取它。这些默认值来自AngularJS

     

您可以使用以下命令以XML配置CookieCsrfTokenRepository

     
<http>
    <!-- ... -->
    <csrf token-repository-ref="tokenRepository"/>
</http>
<b:bean id="tokenRepository"
    class="org.springframework.security.web.csrf.CookieCsrfTokenRepository"
    p:cookieHttpOnly="false"/>
     

该示例显式设置cookieHttpOnly=false。这是允许JavaScript(即AngularJS)读取它所必需的。如果您不需要直接使用JavaScript读取Cookie的功能,建议省略cookieHttpOnly=false以提高安全性。

     

您可以使用以下命令在Java配置中配置CookieCsrfTokenRepository

     
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}
     

该示例显式设置cookieHttpOnly=false。这是允许JavaScript(即AngularJS)读取它所必需的。如果您不需要直接使用JavaScript读取Cookie的功能,建议省略cookieHttpOnly=false(改为使用新的CookieCsrfTokenRepository())以提高安全性。