我正在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,请参阅:
在Websphere中,httpOnly
是false
,因此我无法进行更改以制作所有cookie。
还是我缺少客户端JavaScript可以读取httpOnly
的cookie的东西true
。
答案 0 :(得分:1)
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()
)以提高安全性。