Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全、无状态REST服务和CSRF_Java_Rest_Spring Boot_Spring Security_Csrf - Fatal编程技术网

Java Spring安全、无状态REST服务和CSRF

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

我有一个REST服务,使用Java、Spring引导和Spring安全性以及基本的访问认证构建。没有视图,没有JSP等,没有“登录”,只有可以从单独托管的React应用程序调用的无状态服务

我已经阅读了很多关于CSRF保护的文档,但是我不能决定是使用SpringSecurityCSRF配置,还是仅仅禁用它?如果禁用csrf保护,我可以使用我的基本身份验证调用curl服务,如下所示:

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应用中)。