我正在我的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。
是否有其他替代方法可以保护Web应用程序中的Web应用程序CSRF,其中X-XSRF令牌cookie httpOnly
是true
。
使用JavaScript方法(document.cookie
)我无法读取httpOnly
属性设置为true
的cookie,请参阅:
我不能做出改变来制作所有的cookie,因为httpOnly
是Websphere中的false
。
或者我错过了客户端JavaScript可以读取cookie的东西,httpOnly
是true
。
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()
)来提高安全性。