[英]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可以读取它。
我们无法读取httpOnly
为true
的cookie。
在X-XSRF令牌cookie httpOnly
为true
的Web应用程序中,还有其他任何方法可以保护Web应用程序CSRF。
使用JavaScript方法( document.cookie
),我无法读取httpOnly
属性设置为true
的cookie,请参阅:
我无法进行更改以使所有cookie都因为在Websphere中httpOnly
为false
。
还是我错过了客户端JavaScript可以读取cookie的内容,而该cookie是httpOnly
是true
。
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.