Java Spring安全、无状态REST服务和CSRF
我有一个REST服务,使用Java、Spring引导和Spring安全性以及基本的访问认证构建。没有视图,没有JSP等,没有“登录”,只有可以从单独托管的React应用程序调用的无状态服务 我已经阅读了很多关于CSRF保护的文档,但是我不能决定是使用SpringSecurityCSRF配置,还是仅仅禁用它?如果禁用csrf保护,我可以使用我的基本身份验证调用curl服务,如下所示:Java Spring安全、无状态REST服务和CSRF,java,rest,spring-boot,spring-security,csrf,Java,Rest,Spring Boot,Spring Security,Csrf,我有一个REST服务,使用Java、Spring引导和Spring安全性以及基本的访问认证构建。没有视图,没有JSP等,没有“登录”,只有可以从单独托管的React应用程序调用的无状态服务 我已经阅读了很多关于CSRF保护的文档,但是我不能决定是使用SpringSecurityCSRF配置,还是仅仅禁用它?如果禁用csrf保护,我可以使用我的基本身份验证调用curl服务,如下所示: curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H
curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user
@EnableWebSecurity
@Configuration
public class ServiceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and().httpBasic();
if (!serviceProperties.isCsrfEnabled()) {
http.csrf().disable();
}
}
如果我启用csrf保护并提供x-csrf-token
头,那么spring CsrfFilter会尝试将其与HttpServletRequest
中会话cookie(我认为)的值进行交叉检查。然而,由于它是一个无状态REST服务,我没有会话,也没有“登录”
我有一个config类,如下所示:
curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user
@EnableWebSecurity
@Configuration
public class ServiceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and().httpBasic();
if (!serviceProperties.isCsrfEnabled()) {
http.csrf().disable();
}
}
我想得越多,似乎就越需要禁用CSRF保护。是否有其他方法来配置spring安全性以使其正常工作
感谢您回答第一个问题,在您描述的上下文中,您不需要CSRF保护。CSRF保护的背景是确保用户不会被骗去做一些不必要的动作 例如,从纯理论上讲,你可以登录一家银行的网站(从而建立了一个会话),然后去某个阴暗的网站。这个网站可以有一个表格,向银行的API发出POST请求。因为您在那里有一个会话,如果端点没有受到CSRF保护,那么请求可能会通过 因此,CSRF主要用于抵御基于浏览器+会话的攻击。如果您公开了一个纯RESTAPI,例如OAuth保护,那么我看不出有任何理由使用CSRF 在使用spring boot时,还可以使用
application.properties
/application.yaml
配置文件禁用CSRF
security.enable-csrf=false
您可以查看文档页面以获得更多现成的配置选项。如果您想以更合适的方式禁用csrf,可以这样调用它(如果使用java配置)
这些服务将从单独托管的React应用程序调用,但其目的是使服务调用无状态。我会更新这个问题。感谢您提供answerSpring 1.5.22应用程序属性页()。如果您使用浏览器,则在将凭据存储在浏览器的本地或会话存储中时需要CSRF保护。请注意,您没有使用cookies,但仍在使用。所以我不确定这是一个正确的答案。请看:这个答案实际上与您链接的答案一致。如上所述,无状态身份验证不需要CSRF。它确实易受XSS攻击(这是一个不同的漏洞)。basic auth易受CSRF攻击的唯一方法是浏览器为您记住用户名和密码。因为这个问题是关于一个RESTAPI的,它是从一个单独的hoated SPA调用的。基本身份验证头通过JS代码添加到fetch调用中,而不是在浏览器的基本身份验证提示中输入(因为SPA是单独托管的,例如在CDN上,而不是作为静态资产在Spring应用中)。