【问题标题】:What's the difference between authenticated() and csrf in Spring Security?Spring Security 中的 authenticated() 和 csrf 有什么区别?
【发布时间】:2018-01-18 01:45:22
【问题描述】:

我有一个使用 ReactJS + Spring Boot/Social/Security 构建的 Web 应用程序。

我想确保当我发布它时,我受到 CSRF 的保护。我正在使用大部分开箱即用的 Spring Security,下面是我的基本 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 Social 插件向 Facebook 进行身份验证时,我会将调用重定向到后端应用程序中的端点 (/login/facebook) 以处理成功登录。在这种方法中,我执行以下操作:

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

SecurityContextHolder.getContext().setAuthentication(authentication);

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

【问题讨论】:

    标签: spring spring-boot spring-security csrf-protection spring-social-facebook


    【解决方案1】:

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

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

    不同之处在于身份验证是一个确认过程,但 CSRF 是一种利用经过身份验证的用户的攻击,因为强制 Web 应用程序进行实际上来自已经经过身份验证的用户但用户甚至不知道的事务已经进行了邪恶的交易。这是一个很正常的 CSRF 攻击用例:

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

    我想说的是,身份验证并不能缓解 CSRF 漏洞。使用 Spring 有多种方法可以避免 CSRF 漏洞,请参阅 Spring 文档以获取有关如何配置 CSRF 和缓解此漏洞的非常有用的信息。 Spring Security CSRF attack,如果您想了解更多有关 CSRF 的信息,请访问 OWASP 网站 OWASP CSRF attack

    如何避免 CSRF 的一些示例:

    1. 列出用户可以执行的所有关键操作,例如更改密码、汇款、发送大量消息、删除行等,并使用双重身份验证过程,例如向用户询问只有用户知道的问题,最喜欢的食物,父亲的第二个名字,通常是用户在注册过程中必须填写的问题。在采取行动之前提出问题,以便通过双重身份验证进行确认。
    2. 为每个 http 请求使用一个安全令牌,并且应该为您的应用程序验证该令牌,它可以避免恶意站点向您发送有效请求,因为恶意站点不知道令牌编号是什么。

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2019-04-18
      • 2011-09-11
      • 2019-11-30
      • 2010-11-16
      • 2015-12-10
      • 2010-12-09
      • 2012-12-11
      相关资源
      最近更新 更多