Spring Security中authenticated()和csrf之间有什么区别?

时间:2017-08-10 01:31:23

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

我有一个使用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发出的任何后续请求都将被识别为已通过身份验证。

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 用户访问mybank.com
  2. 用户填写用户名和密码,然后按登录按钮(身份验证)
  3. mybank.com显示欢迎页面并列出转账选项
  4. 用户看到一个不寻常的弹出窗口,访问一个非常酷的网站,以获得很酷的图片,然后点击弹出消息(可能是xss攻击)
  5. 用户返回mybank.com,看到已经进行了新的汇款,并且已成功完成了对$$$$的撤销(csrf攻击来自酷炫图片的点击)
  6. 我想说的是,身份验证不会减轻CSRF漏洞。有一些方法可以避免使用Spring转到Spring文档来避免CSRF漏洞,以获取有关如何配置CSRF和缓解此漏洞的非常有用的信息。 Spring Security CSRF attack,如果您想了解有关CSRF的更多信息,请访问OWASP网站OWASP CSRF attack

    如何避免CSRF的一些例子:

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