繁体   English   中英

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

[英]Protecting web application from CSRF attack using Spring Security

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

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

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

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

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

我们无法读取httpOnlytrue的cookie。

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

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

我无法进行更改以使所有cookie都因为在Websphere中httpOnlyfalse

还是我错过了客户端JavaScript可以读取cookie的内容,而该cookie是httpOnlytrue

参见Spring Security Reference

CookieCsrfTokenRepository

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

您可以使用以下CookieCsrfTokenRepository以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以提高安全性。

您可以使用以下CookieCsrfTokenRepository在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()代替)以提高安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM