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

问题描述 投票:0回答:1

我正在我的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。

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

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

我不能做出改变来制作所有的cookie,因为httpOnly是Websphere中的false

或者我错过了客户端JavaScript可以读取cookie的东西,httpOnlytrue

javascript java spring spring-security csrf
1个回答
2
投票

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())来提高安全性。

© www.soinside.com 2019 - 2024. All rights reserved.