当前位置: 首页 > 知识库问答 >
问题:

Spring Security、无状态REST服务和CSRF

江飞章
2023-03-14

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

我已经阅读了各种关于CSRF保护的留档,但是我不能决定我应该使用Spring安全CSRF配置,还是仅仅禁用它?如果我禁用csrf保护,我可以使用我的基本权限像这样使用curl调用服务:

curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user

如果我启用csrf保护并提供x-csrf-token头,那么spring CsrfFilter会尝试将其与HttpServletRequest中会话cookie(我认为)的值进行交叉检查。然而,由于它是一个无状态REST服务,我没有会话,也没有“登录”。

我有一个配置类,看起来像这样:

@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安全,这样它就可以工作了?

谢谢

共有2个答案

东郭自强
2023-03-14

如果您想以更合适的方式禁用csrf,可以这样调用它(如果使用java配置)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and().httpBasic();
       .and()
            .csrf()
            .disable()
韩景胜
2023-03-14

为了回答您的第一个问题,在您描述的上下文中,您不需要CSRF保护。CSRF保护的背景是确保用户不会被骗去做一些不必要的动作。

例如,在纯理论中,您可以登录银行的网站(从而建立一个会话),然后访问某个可疑的网站。这个网站可能有一个表单,向银行的应用编程接口发出POST请求。因为你在那里有一个会话,如果endpoint不受CSRF保护,那么请求可能会通过。

因此,CSRF主要用于抵御基于浏览器会话的攻击。如果您公开了一个带有OAuth保护的纯REST API,那么我看不出有任何理由使用CSRF。

当您使用Spring引导时,您还可以使用application.properties/application.yaml配置文件禁用CSRF。

security.enable-csrf=false

您可以查看通用应用程序属性留档页,了解更多开箱即用的配置选项。

 类似资料:
  • 示例: state state 是另外一个元数据。 如果你在元数据中设置了state=inactive, 客户端将不能访问这些服务,即使这些服务是"活"着的。 你可以使用临时禁用一些服务,而不是杀掉它们, 这样就实现了服务的降级。 server. 你可以通过 rpcx-ui)来时实现禁用和启用的功能。 ```go server.go func main() { flag.Parse() go cr

  • 问题内容: 我试图理解这一点。通常,每次用户登录系统时,服务器端都会创建一个会话,而用户客户端端则有cookie。当人们谈论无状态服务器端,有状态客户端时,它们是什么意思?服务器端无需使用会话保持跟踪用户?只在客户端使用Cookie来检查用户?意味着如果我更换服务器,用户将不会注意到它,仍然可以继续使用该服务? 如何配置spring-security来做到这一点? 问题答案: 对于真正的无状态服务

  • 有可能保护无状态REST API免受XSS和CSRF攻击吗? 目前,我使用存储在secure/httpOnly cookie中的JWT令牌进行无状态身份验证。这应该可以保护API免受最常见的XSS攻击:使用XSS注入的JavaScript窃取Cookie并将其发送给攻击者。 然而,这并不能保护API免受CSRF攻击,在这种攻击中,攻击者会欺骗经过身份验证的用户跟踪特定web API调用的链接,从而

  • 我试图实现jwt在cookie中的auth在一个单页应用程序的反应前端,它与运行Express的各种节点微服务通信。 我这样做,因为它似乎存储的jwt在sesionstore使应用程序容易受到XSS。 然而,通过使用cookie,API现在容易受到csrf攻击。 传统上,csrf攻击是通过创建csrf令牌,将其存储在服务器会话中,然后将其呈现在隐藏的表单字段中来减轻的。然后,在提交表单时,csrf

  • 订单状态同步服务 简介 为及时获取订单状态和信息,用于对员工或用户的用车权限进行管控或对账,滴滴提供订单状态同步服务。订单状态同步需由订单状态回调和轮询同时进行。 说明 接入方可以在管理中心的应用详情中开启应用的回调服务,请务必配置有效的回调地址。当产生需要通知回调的场景时,滴滴侧服务端将进行回调。 收到回调通知后,请按照规定返回回调结果。通过该接口获取订单的最新信息。建议记录在本地数据库中,供后

  • 在接口流中: 中间操作可分为有状态和无状态。它们影响并行流的结果。 只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们影响并行流的结果。 如果中间无状态操作执行惰性操作,它们可能会产生副作用。这会影响并行Stream的结果。 中间操作可分为以下几类: 有状态 不同的() 排序() 极限(长l) 跳过(长l) 无国籍 地图(功能f) 以下是我的两个问题: >