Spring 安全性中的 authenticated() 和 csrf 有什么区别?

What's the difference between authenticated() and csrf in Spring Security?

我有一个使用 ReactJS + Spring Boot/Social/Security.

构建的网络应用程序

我想确保在发布它时,我免受 CSRF 攻击。我开箱即用地使用了大部分 Spring 安全性,下面是我的基本 configure() 覆盖:

@Configuration
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER)
 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
     http
             .authorizeRequests()
             .antMatchers("/login/facebook").permitAll()
             .antMatchers("/logout").permitAll()
             .antMatchers("/api/**").authenticated()
             .and().csrf().disable();
  }
}

我的问题是,由于我对后端的所有 (/api/**) 请求仅在经过身份验证时才被允许,这是否可以保护我免受 CSRF 攻击?

明确地说,当用户通过 Spring 社交插件对 Facebook 进行身份验证时,我将调用重定向到我后端应用程序中的端点 (/login/facebook) 以处理成功登录。在这种方法中,我执行以下操作:

UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(theUser.getFacebookId(), null, null);

SecurityContextHolder.getContext().setAuthentication(authentication);

这可确保向 /api 发出的任何后续请求都将被识别为已通过身份验证。

身份验证是确认某人声称自己是谁的行为或过程。

Owasp:跨站请求伪造 (CSRF) 是一种攻击,它迫使最终用户在他们当前已通过身份验证的 Web 应用程序上执行不需要的操作。

不同之处在于,身份验证是一个确认过程,而 CSRF 是一种利用经过身份验证的用户的攻击,因为它迫使 W​​eb 应用程序进行交易,而该交易实际上来自已经通过身份验证的用户,但用户并未甚至知道已经进行了邪恶的交易。这是 CSRF 攻击的一个非常正常的用例:

  1. 用户转到 mybank.com
  2. 用户填写用户名和密码并按登录按钮(身份验证)
  3. mybank.com 显示欢迎页面并列出转账选项
  4. 用户看到一个不寻常的弹出窗口,要求访问一个非常酷的网站以获取漂亮的图片,然后单击弹出消息(可能是 xss 攻击)
  5. 用户 return 到 mybank.com 并看到已经进行了新的汇款并且成功完成了 $$$$ 的提款(来自酷图片的邪恶弹出窗口的 csrf 攻击点击)

我想说的是身份验证并不能缓解 CSRF 漏洞。有多种方法可以避免 CSRF 漏洞,使用 spring 转到 Spring 文档以获得有关如何配置 CSRF 和缓解此漏洞的非常有用的信息。 Spring Security CSRF attack, and if you want to know more about CSRF go to OWASP site OWASP CSRF attack

如何避免 CSRF 的一些示例:

  1. 列出用户可以执行的所有关键操作,例如更改密码、转账、发送大量消息、删除行等,并使用双重身份验证过程,例如向用户询问只有用户才能进行的问题知道,最喜欢的食物,父亲的姓氏,通常是用户在注册过程中必须填写的那种问题。在进行操作之前提出问题,以便通过双重身份验证进行确认。
  2. 每个 http 请求都使用一个安全令牌,并且该令牌应该针对您的应用程序进行验证,这可以避免恶意站点向您发送有效请求,因为恶意站点不知道令牌号是多少。